1. 程式人生 > >c++習題1_H_虛擬函式-計算圖形面積

c++習題1_H_虛擬函式-計算圖形面積

/*
*作者:lws
*完成時間:2014/6/14
*描述:編寫一個程式,定義抽象基類Shape,由它派生出5個派生類: Circle(圓形)、Square(正方形)、Rectangle(矩形)、Trapezoid(梯形)、Triangle(三角形)。
用虛擬函式分別計算幾種圖形面積,並求它們之和。
要求用基類指標陣列,使它每一個元素指向一個派生類物件。
*輸入:12.6 3.5 4.5 8.4 2.0 4.5 3.2 4.5 8.4
*輸出:total of all areas=574.11
*/
#include <iostream>
#include <iomanip>
const double PI=3.14159;
using namespace std;
class Shape //抽象類(包含純虛擬函式的類)
{
public:
    virtual double Area()=0; //純虛擬函式(沒有函式體的虛擬函式)
};
//圓形類
class Circle:public Shape
{
public:
    Circle(double r):radius(r){}
    double Area()
    {
       return PI*radius*radius;
    }
private:
    double radius;
};
//正方形類
class Square:public Shape
{
public:
    Square(double s):side(s){}
    double Area()
    {
        return side*side;
    }
private:
    double side;
};
//矩形類
class Rectangle:public Shape
{
public:
    Rectangle(double l,double w):length(l),width(w){}
    double Area()
    {
        return length*width;
    }
private:
    double length;
    double width;
};
//梯形類
class Trapezoid:public Shape
{
public:
    Trapezoid(double u,double d,double h):up(u),down(d),height(h){}
    double Area()
    {
        return 1/2.0*(up+down)*height;
    }
private:
    double up,down,height;
};
//三角形類
class Triangle:public Shape
{
public:
    Triangle(double a1,double b1):a(a1),b(b1){}
    double Area()
    {
        return 1/2.0*a*b;
    }
private:
    double a,b;
};

void PrintArea(Shape &p)
{
    cout<<p.Area();
//p.Aare()函式處理方法:在編譯階段,不確定呼叫哪一個函式,而是在此處保留5個虛擬函式Area()的5個入口地址。
//在程式執行時,根據實參的型別來確定呼叫5個虛擬函式之一。
}

int main()
{
    float r,a,b,w1,w2,w,h;
    cout<<fixed<<setprecision(2);
    cin>>r;
    Circle circle(r);
    cin>>a;
    Square square(a);
    cin>>a>>b;
    Rectangle rectangle(a,b);
    cin>>w1>>w2>>h;
    Trapezoid trapezoid(w1,w1,h);
    cin>>w>>h;
    Triangle triangle(w,h);
    //抽象類的指標引用——>由抽象類派生出的類的物件
    Shape *pt[5]= {&circle,&square,&rectangle,&trapezoid,&triangle};
    double areas=0.0;
    for(int i=0; i<5; i++)
        areas=areas+pt[i]->Area();
    cout<<"total of all areas="<<areas<<endl;
    return 0;
    return 0;
}

執行結果:


相關推薦

c++習題1_H_虛擬函式-計算圖形面積

/* *作者:lws *完成時間:2014/6/14 *描述:編寫一個程式,定義抽象基類Shape,由它派生出5個派生類: Circle(圓形)、Square(正方形)、Rectangle(矩形)、Trapezoid(梯形)、Triangle(三角形)。 用虛擬函式分別計算

第14周 專案二 oj虛擬函式計算圖形面積

/* *程式的版權和版本宣告部分: *Copyright(c)2014,煙臺大學計算機學院學生 *All rights reserved. *檔名稱: *作者:王魯峰 *完成日期:2014 年 5 月 27 日 *版本號:v1.0 *對任務及求解方法的描述部分: *問題描述

《隨筆九》—— C++中的 “ 虛擬函式

目錄 定義虛擬函式 三種呼叫虛擬函式的方式比較 虛擬函式的訪問方法 看不懂可以先看這個:《隨筆八》—— C++中的“ 多型中的靜態聯編 、動態聯編”https://blog.csdn.net/qq_34536551/article/details/84195882 虛

C++中的虛擬函式和解構函式的定義和作用

虛擬函式 定義: C++中的虛擬函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。 虛擬函式的使用方法是: 在基類用virtual宣告成員函式為虛擬函式。這樣就可以在派生類中重新定義此函式,為它賦予新的功能,並能

《隨筆十六》——C#中的 “ 虛擬函式

目錄 使用基類的引用 虛方法 和覆寫方法 覆寫標記為override 的方法 覆蓋屬性 建構函式初始化語句 使用基類的引用 ●  派生類的例項由基類的例項加上派生類新增的成員組成。  派生類的引用指向整個類物件,包括基類部分。 如果

C++學習筆記——虛擬函式

用virtual關鍵字說明的函式是虛擬函式,是實現執行時多型的基礎,C++中的虛擬函式是動態繫結的函式,且必須是非靜態的函式成員,虛擬函式經過派生之後就可以實現執行過程中的多型。 一般成員函式可以是虛擬函式,建構函式不可以是虛擬函式,解構函式可以是虛擬函式。 虛擬函式的宣告格式: vir

C/C++雜記:虛擬函式的實現的基本原理 虛擬函式

部落格園 首頁 新隨筆 聯絡 訂閱 管理 1. 概述 簡單地說,每一個含有虛擬函式(無論是其本身的,還是繼承而來的)的類都至少有一個與之對應的虛擬函式表,其中存放著該類所有的虛擬函式對應的函式指標。例: 其中: B的虛擬函式表中存放著B::fo

C++中的虛擬函式與靜態聯編和動態聯編

          程式在呼叫函式時,將使用哪個可執行程式碼塊呢?編譯器負責回答這個問題,將原始碼中的函式呼叫解釋為執行特定的函式程式碼塊被稱為函式名聯編。在C中,因為每個函式名都對應一個不同的函式,而在C++中,由於函式過載的緣故,編譯器必須檢視函式引數以及函式名才能確定

C++:11---虛擬函式虛擬函式表、多型、純虛擬函式(抽象類、介面)

 介紹虛擬函式之前,先舉一個繼承中的例項 class A { public: void show()const {cout<<"A";}; }; class B:public A //B繼承於A { public: void show()cons

[筆記]c++包含純虛擬函式的類不允許被例項化

class CalcTax{ public: virtual void calc_tax()=0; // 純虛擬函式 }; class SalesOrder{ private: Cal

C/C++】C++之private虛擬函式

一般我們說虛擬函式,它的訪問級別都是public的,用類物件可以直接呼叫,這樣就可以實現執行時的型別繫結,那如果我們將虛擬函式私有化會出現什麼情況呢? 我們先來看一個非虛擬函式私有化的例子 class Base { private: void Prin

C++中純虛擬函式的實現原理是什麼,為什麼該純虛擬函式不能例項化?

虛擬函式的原理採用 vtable。 類中含有純虛擬函式時,其vtable 不完全,有個空位。 即“純虛擬函式在類的vftable表中對應的表項被賦值為0。也就是指向一個不存在的函式。由於編譯器絕對不允許有呼叫一個不存在的函式的可能,所以該類不能生成物件。在它的派生類中,除非

C++覆蓋(虛擬函式的實現原理)

Class Shape { public: virtual void cal_area() { } private: int m_ir; }; Class Circle:public Shape { public: vi

java中介面類似c++中純虛擬函式

interface CalInterface {     final float PI=3.14159f;//定義用於表示圓周率的常量PI     float getArea(float r);//定義一個用於計算面積的方法getArea()     float getCircumference(floa

c語言練習題 3-2 計算矩形面積

矩形面積計算 #include<stdio.h> int max(int a,int b) { if(a>b) { return a; } else { return b; } } int min(int a,int b) {

c++ 多型 虛擬函式 解構函式 抽象類(轉)

1. 解構函式和虛解構函式 如果基類的解構函式是虛的,那麼它的派生類的解構函式都是虛的 這將導致:當派生類析構的時候,它的所有的基類的解構函式都將得到呼叫 否則,只調用派生類的解構函式(這可能導致基類的某些物件沒有得到釋放) 所以CObject類的解構函式是虛的,所有由它

C++中的虛擬函式及其實現方式

首先看程式碼,不採用虛擬函式的情況 // ConsoleApplication1.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <iostream> using namespace std; cl

C++中的虛擬函式(表)實現機制詳解

前言大家都應該知道C++的精髓是虛擬函式吧? 虛擬函式帶來的好處就是: 可以定義一個基類的指標, 其指向一個繼承類, 當通過基類的指標去呼叫函式時, 可以在執行時決定該呼叫基類的函式還是繼承類的函式. 虛擬函式是實現多型(動態繫結)/介面函式的基礎. 可以說: 沒有虛擬函式,

C++的精髓——虛擬函式原理

轉自:http://blog.chinaunix.net/uid-26851094-id-3327323.html 虛(virtual)函式的一般實現模型是:每一個類(class)有一個虛表(virtual table),內含該class之中有作用的虛(virtual

C++ override及虛擬函式的講解

1  公有繼承   公有繼承包含兩部分:一是 "介面" (interface),二是 "實現" (implementation)   基類 Shape 中,三個成員函式,代表三種繼承方式: class Shape { public: virtual void Draw() const = 0;