关于c++抽象类的问题,调用虚函数

#include
#include
using namespace std;
class shape
{
public:
virtual float area() const=0;
};
class circle:public shape
{
public:
circle(float r)
{
radius=r;
}
virtual float area() const
{
return 3.14159*radius*radius;
}
protected:
float radius;
};
class rectangle:public circle
{
public:
rectangle(float r,float l,float w,float h):circle(r)
{
length=l;
width=w;
height=h;
}
virtual float area()
{
return length*width*height;
}
protected:
float length;
float width;
float height;
};
class triangle:public rectangle
{
public:
triangle(float r,float l,float w,float h,float a1,float b1,float c1):rectangle(l,w,h,r)
{
a=a1;
b=b1;
c=c1;
}
virtual float area() const
{

    return sqrt(((a+b+c)/2)*(((a+b+c)/2)-a)*(((a+b+c)/2)-b)*(((a+b+c)/2)-c));
}

protected:
float a;
float b;
float c;
};
int main()
{
circle c(2);
rectangle re(1,1,1,1);
triangle t(2,4,4,5,3,4,5);
circle *p=&c;
cout<area()< p=&re;
coutarea()< p=&t;
coutarea()<<endl;

return 0;

}

程序可以运行 但是对象c和对象re调用的display()函数为什么是同一个 ?求大神帮助啊

1个回答

rectangle 的 area 方法缺了const,所以不认为是基类的area的重写

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于C++抽象类、虚函数
今天查询了一些关于C++抽象类、虚函数的知识,下面做一下总结: 在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”。[c
虚函数和抽象类
文章目录定义与概念 定义与概念 纯虚函数:一个函数只有函数名和形参列表,没有具体实现;语法:virtual double GetArea()=0; 抽象类:在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象。抽象类是不完整的,它只能用作基类。 普通类继承抽象类必须实现全部纯虚函数,否则依然不能实例化,还是一个抽象类。 意义:通过抽象类来构建接口,不同的子类实现接口,通过抽象类的指针来接不...
关于虚函数的调用问题。
现在有一个基类:rnAbstractA: 它里面定义的全部是虚函数。rn例如:virtual VOID OnInitialize() = 0; (这里的等于0是什么意思????)rnrn另外有一个类 Class Main. 其中定义了一个函数rnAbstractA* GetInterface()rnrn return m_pInterface;// m_pInterface的定义是: AbstractA* m_pInterfacernrnrn然后有一个子类 class A;public AbstractArn子类中将这个抽象父类中的虚函数重载。rnrn例如: VOID A:OnInitialize()rn rn int a = 0 ;rn rn 现在我在子类的另一个函数中调用rn VOID A:GetData()rn rn Main::GetInterface->OnInitialize(); rn ///这个时候程序会进入父类的虚函数,还是子类的这个函数呢???rn rn
关于虚函数的全局调用的问题
代码如下:rn#include "stdafx.h"rn#include "iostream.h"rnclass daternpublic:rndata();rn virtual void show();rnrnrnshow(data* d)rnd->show();rnrnclass dataInt:public datarn private;rn int val;rnpublic:rn dataInt(int& i)val=i;rn virtual void show()rn cout<<"the integer number is:"<' : function-style initializer appears to be a function definitionrnC:\Documents and Settings\gaoy\My Documents\3\3.cpp(12) : error C2516: 'data' : is not a legal base classrnC:\Documents and Settings\gaoy\My Documents\3\3.cpp(13) : error C2320: expected ':' to follow access specifier ';'rnC:\Documents and Settings\gaoy\My Documents\3\3.cpp(21) : error C2516: 'data' : is not a legal base classrnC:\Documents and Settings\gaoy\My Documents\3\3.cpp(22) : error C2320: expected ':' to follow access specifier ';'rnC:\Documents and Settings\gaoy\My Documents\3\3.cpp(30) : error C2516: 'data' : is not a legal base classrnC:\Documents and Settings\gaoy\My Documents\3\3.cpp(31) : error C2320: expected ':' to follow access specifier ';'rnC:\Documents and Settings\gaoy\My Documents\3\3.cpp(52) : fatal error C1004: unexpected end of file foundrnError executing cl.exe.
一个关于虚函数调用的问题
有这样一段代码:rnrn#include rnrnclass Arnrnpublic:rn A()rn rn rn virtual void C() = 0 ;rn virtual void D() = 0 ;rn virtual void E() = 0 ;rnprivate:rn ;rnrnclass B : public Arnrnpublic:rn virtual void C()rn rn printf("fuck") ;rn rn virtual void D()rn rn printf("fuck") ;rn rn virtual void E()rn rn printf("fuck") ;rn rnrnprivate:rn;rnrntypedef void (A::*ptc)() ;rnrnint main(int argc, char* argv[])rnrn ptc ab = A::D ;rnrn printf("Hello World! %x\n", ab);rnrn return 0;rnrnrn我在main函数里面得到的ab值,在VC的IDE调试的时候,显示是vcall,地址是401xxx,rn这个地方的反汇编代码是:rn004010xx 8B01 MOV EAX, [ECX]rn004010xx FF60 04 JMP [EAX+4]rnrn我感觉这个应该就是调用虚函数的时候应该执行的地方。rnrn但是在调用B::D()这个函数的时候,从类的虚表里面得到函数地址,直接调用过去了,这儿根本没有执行到。rn这个是怎么回事?rnrn哪位大侠可以帮忙解释一下?
C++虚函数与抽象类
C++虚函数与抽象类 1.虚函数 I&gt;虚函数声明: 在类内的函数声明前加virtual,类外定义时不用加 class A { public: A() { } virtual void f(); }; void A::f() { cout &lt;&lt; "A::f()" &lt;&lt; endl; } class B : public A{ ...
虚基类、虚函数、抽象类
虚基类 使用虚基类,可以使得在派生类中只保留间接基类的一份成员。 声明虚基类只需要在继承方式前面加上 virtual 关键字 虚函数 成员函数前面加virtual关键字,基类的虚函数不用实现,派生时再具体实现 抽象类 虚函数等于0,不能实例化 ...
虚函数、抽象类、接口类
虚函数与纯虚函数:虚函数有函数体,纯虚函数没有函数体,并且在定义时函数名后面要加=0。 纯虚函数与抽象类:包含纯虚函数的类称为抽象类,抽象类无法实例化对象,靠继承抽象类的子类来定义实现纯虚函数。 抽象类与接口类:如果在抽象类中仅含有纯虚函数,此种类就称为接口类。接口类没有数据成员,只含有成员函数,且成员函数都是纯虚函数。接口类表达了一种能力或者协议。
虚函数、纯虚函数与抽象类(浅论)
    在面向对象的程序设计中,虚函数,纯虚函数与抽象类一直是工作和求职面试中的重点难点问题。本人在这里对这三者做一个浅显的论述。有不对的地方欢迎各位同行批评指正。(作者原创,转载请注明出处)。    提起虚函数,就不得不提多态性。多态性是面向对象程序设计的一个重要特征,如果一个语言只支持类而不支持多态,是不能称为面向对象的语言,只能说是基于对象的语言。    那么问题来了,什么是多态?    多...
C++多态性、虚函数、抽象类
一、多态 C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。 1、多态:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为。 C++中,多态性表现形式之一,具有不同功能的函数可以用同一个函数名,即函数的重载 2、多态性,从系统实现上分为静态多态性和动态多态性 (1)静态多态性:在程序编译时系统就能决定调用的是哪个函数。如函数的重载和运算符的重载。 ...
继承,虚函数,抽象类
这个实例介绍了“继承,虚函数,抽象类”的相关用法和注意事项,里面有代码和一些知识点,方便新手学习和理解这些概念,相当于书与代码的结合。
接口,虚函数,抽象类的理解
说明:接口其实就是程序之间的一种协定,用来约束一组相关的行为。这三种概念的功能很类似下面通过一些例子来说明。 1.接口 现在有三个动物:猫,狗,鸭子,猫不会游泳,狗会游泳,鸭子会游泳。我们要描述这三种动物,如果采用虚函数的形式,则无法解决游泳函数问题 using System; class dongwu //基类 { virtual public void youyong() //
C++ 抽象类虚函数和多态
1.纯虚函数纯虚函数只声明,而没有具体的实现,这样的函数称为纯虚函数,纯虚函数的语法如下virtual 返回值类型,函数名称(参数列表)=0;2.抽象类含义纯虚函数的类称为抽象类,抽象类至少含有一个纯虚函数。3.抽象类不能被实例化,只能被作为父类继承需使用,可以创建指针的形式,指向子类的类型4.虚函数实现多态的基础,多态是指一个函数有多重状态,根据父类的引用或者指针指向的子类不同,而动态调用。5....
C++之虚函数的使用及抽象类
C++之虚函数的使用及抽象类
C++之虚函数、多态、抽象类
虚函数 语法: 1 父类------有了virtual,则 子类 才可能 使用到  多态 2 子类中的 virtual可以省--------但最好别省 3 必须使用new ,给 父类地址变量 赋值,才能用到 多态。 //代码: int main() { CStudent_college stu1(1001,"zhangsan","计算机系","软件专业"); CStudent_p
c++(虚函数、纯虚函数和抽象类)
目录 一、虚函数 1.1问题引入 1.2虚函数 二、纯虚函数 三、抽象类 1.1 注意: 1.2程序举例 一、虚函数 1.1问题引入 c++在默认情况下,对函数成员的调用实施的是静态连编(staticbinding),也叫静态绑定。 此时,如果子类中的函数F覆盖了基类的函数F,那么基类中的其他函数调用函数F的时候,调用的仍然是基类中的这个函数F,而不是子类中覆盖...
C++——虚函数与抽象类
虚函数 虚函数:(virtual function)允许函数调用与函数体间的联系在运行时才建立,是实现动态联编的基础。 虚函数的定义:   virtual 函数类型 函数(形参表) {    函数体; } 使用使用虚函数实现动态联编需满足: 类型兼容规则。 在基类中定义虚函数,在派生类中重新定义。如果派生类中没有重新定义虚函数,基类虚函数充当派生类的虚函数。 要由成员函数、指针或引...
[C++] 虚函数、抽象类和多态
2019.3.7 修改C++对象模型机制错误 虚函数 被virtual关键字修饰的函数,称为虚函数,它的应用有以下限制: 类对象有虚函数表,存放所有的虚函数地址 静态函数不能是虚函数,因为静态函数不属于任何一个class object 内联函数不能是虚函数 构造函数不能是虚函数 纯虚函数 纯虚函数是虚函数的一种特例,其格式是: virtual func() = 0; ...
抽象类与虚函数的应用
(1)定义一个抽象类Animal,该类中可以存放动物的名字,并有一个纯虚函数Identify用于显示动物的种类和名字。将析构函数声明为虚函数。 (2)定义两个类Cat、Dog,都继承自Animal,并重载Identify函数,显示动物的种类及名字。 (3)定义一个Tiger类,继承自Cat,重载Identify函数,显示动物的种类和名字。 (4)定义一个动物园类Zoo,管理动物。类Zoo的定义和实现可以参照下面的代码。注意指针虚函数的用法。
虚函数,纯虚函数,抽象类
第一次看到多态性,是什么都不知道的,看书之后就能明白什么是虚函数,什么是纯虚函数,什么是抽象类,要是没有之前的实践,我想想要明白其中的原理还是很困难的,所以,多加练习,多付出实践还是能够得到不小的回报。 还得继续加油!!!
虚函数_纯虚函数_抽象类
1、只要含有纯虚函数的类就是抽象类,不能实例化对象; 2、关于多态,简而言之,就是用父类类型的指针指向其子类实例,然后通过父类的指针调用实际子类的成员函数。 ※需要和虚函数表结合理解(参考文章:C++进阶之虚函数表) 例程: #include &lt;iostream&gt; using namespace std; class A // 抽象类 { public: virtual...
关于类包含虚函数的内存结构和虚函数调用
class A { public: A(){}; ~A(){}; int a,b; virtual int getb(){return b;}; virtual int geta(){return a;} } class B : public A { public: ........ virtual int getb(){return b;}; virtual 
虚函数调用问题
1. #include  using namespace std; class A { public:     int a;     A(int aa = 1) { a = aa; }      void print() {         cout      } }; class B : public A { public:     int a;     B(
父类虚函数调用问题
我知道通过虚函数实现多态,用父类指针指向子类对象,如果调用被子类覆盖的虚函数,将调用被覆盖后的函数,这是通过虚函数实现,原理就是,在子类虚函数表中替换了父类虚函数的地址。这时要调用父类的此虚函数,只能通过 Base::函数名来实现 ,但是虚函数地址只放在虚函数表中,现在父类的虚函数地下被替换了,通过Base::函数名又是如何找到父类的虚函数的呢,请赐教!
虚函数调用的问题
class B rn rn public virtual void foo () rn rnrnclass D : B rnrn public override void foo () rnrn rnrnrnclass N : D rnrn rnrnpublic new void foo () rnrnpublic static void Main() rnrnN n = new N (); rnrnn.foo( ) ; rnrn((D)n).foo( ) ; rnrn((B)n).foo( ) ; // 这里调用的是哪个类的foo ?为什么?rnrnrnrnrnrn rn
虚函数继承调用问题
class Arnrnpublic:rn virtual void fun()rn rn cout<<"AAAAAAA"<fun();rnrnrnb.fun();这句调用是不对的,因为它调用的是私有成员函数rnp->fun();这句为何调用却是对的呢,而且输出结果是BBBBBBB!!!感觉不可思议,又是虚函数的问题吗??请讲细点,谢谢!
C++多态与虚函数、抽象类与纯虚函数
什么是多态?如何去理解多态?多态的好处是什么?静态绑定和动态绑定 多态是指类中具有相似功能的不同函数,使用同一个名称来实现;是对类的行为再抽象; 多态从实现的角度可以分为: (1)编译时的多态:静态联编(重载、强制、参数),程序编译连接阶段完成。 (2)运行时的多态:动态联编(包含),程序运行阶段完成。 其中静态多态是通过函数重载与模板体现的,动态多态是通过虚函数来体现的 多态的...
C++第九节:多态、虚函数、抽象类
虚函数、虚析构、动态绑定、纯虚函数、抽象类、多态
C++虚函数(抽象类)实现面向接口编程
#define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; using namespace std; //抽象类1 class Interface1 { public: //纯虚函数 virtual void func(int a, int b) = 0; virtual void func2(int a) = 0; }; ...
抽象类,虚函数,类的继承问题没人能解决?!!
[code=C/C++][/code]#include rnrn//#define pi 3.1415926rndouble const pi = 3.1415926;rnrnclass Shapernrnpublic:rn Shape () rn virtual double area () const rn rn return (0.0);rn rn virtual double volum () const rn rn return (0.0);rn rn virtual void shape_name () const = 0;rn;rnrn//define a Point classrnrnclass Point:public Shapernrnpublic:rn Point (double x=0, double y=0):point_x(x), point_y (y) rn virtual void shap_name () const;rn friend ostream & operator << (ostream & output, const Point & p);rn virtual void set_point ();rn virtual void get_point () const;rnprotected:rn double point_x;rn double point_y;rn;rnrnvoid Point::shap_name () constrnrn cout << "Point:" << endl;rnrnrnvoid Point::set_point ()rnrn cout << "Please set the points:";rn cin >> point_x >> point_y;rnrnrnvoid Point::get_point () constrnrn cout << "(" << point_x << ',' << point_y << ")" << endl;rnrnostream & operator << (ostream & output, const Point & p)rnrn output << "(" << p.point_x << ',' << p.point_y << ")" << endl;rn return output;rnrnrn//define a Circle classrnrnclass Circle:public Pointrnrnpublic:rn Circle (double x, double y, double r):Point (x, y), radius (r) rn void set_radius ();rn double get_radius () const;rn virtual double area () const;rn virtual void shap_name () const;rn friend ostream & operator << (ostream &output, const Circle &c);rnprotected: //保护成员在派生类中可以被引用,而私有成员则不能!rn double radius;rn;rnrnvoid Circle::shap_name () constrnrn cout << "Circle:" << endl;rnrnrnvoid Circle::set_radius ()rnrn cout << "Please set the radius of the circle:" << endl;rn cin >> radius;rn rnrnrndouble Circle::get_radius () constrnrn return radius;rnrnrndouble Circle::area () constrnrn return (pi*radius*radius);rnrnrnostream & operator << (ostream &output, const Circle &c)rnrn output << '(' << c.point_x << ',' << c.point_y << ')' << "radius = " << c.radius << endl;rn return output;rnrnrn//Define a Cylinder classrnrnclass Cylinder:public Circlernrnpublic:rn Cylinder (double x, double y, double r, double h):Circle (x, y, r), height (h) rn void set_height ();rn void get_height () const;rn virtual double area () const;rn virtual double volum () const;rn virtual void shap_name () const;rn friend ostream & operator << (ostream &output, Cylinder &cy);rnprivate:rn double height;rn;rnrnvoid Cylinder::shap_name () constrnrn cout << "cylinder:" << endl;rnrnrnvoid Cylinder::set_height ()rnrn cout << "Please set the height of the cylinder:" << endl;rn cin >> height;rnrnrnvoid Cylinder::get_height () constrnrn cout << height << endl;rnrnrndouble Cylinder::area () const rnrn return (2*Circle::area () + 2*pi* Circle::get_radius () *height);rnrnrndouble Cylinder::volum () const rnrn return (Circle::area () * height);rnrnrnostream & operator << (ostream &output, Cylinder &cy)rnrn output << '(' << cy.point_x << ',' << cy.point_y << ')' << "radius = " << cy.radiusrn << "volum = ";rn cy.volum ();rn return output;rnrnrnvoid main ()rnrn Point point (3.2, 4.5);rn Circle circle (2.4, 1.2, 5.6);rn Cylinder cylinder (3.5, 6.4, 5.2, 10.5);rn rn point.shap_name ();rn cout << point;rn rn circle.shap_name ();rn cout << circle;rn rn cylinder.shap_name ();rn cout << cylinder;rn rn Shape *pt;rn pt = &point;rn point.get_point () ;rn// pt->get_point (); //用指针调用函数为何不行?!Point是Shape的派生类,指针虽然指向的是Shape类,但是get_point ()声明的是虚函数,应该能用指针调用啊?!!rn cout << "The area of the point is:" << endl;rn pt->area ();rn rn pt = &circle;rn pt->shape_name ();rn// cout << '(' << pt->point_x << ',' << pt->point_y << ')' << endl;rn circle.get_point ();rn cout << "radius = " << circle.get_radius ();rn cout << "The area of the circle is:" << endl;rn cout << circle.area () << endl;rn// cout << pt->area () << endl;rn rn pt = &cylinder;rn pt->shape_name ();rn cylinder.get_point ();rn// cout << '(' << cylinder.point_x << ',' << cylinder.point_y << ')' << endl;rn cylinder.get_radius ();rn// cout << "radius = " << pt->get_radius () << endl;rn cout << "height = ";rn cylinder.get_height ();rn// pt->get_height ();rn cout << "The area of the cylinder is:" << endl;rn// cylinder.volum ();rn cout << pt ->volum ();rnrn rnrn
虚函数,虚析构函数,纯虚函数,多态性,抽象类。
1、虚函数:虚函数可以实现函数的覆盖,使得派生类中的函数得以实现,提高了程序的可扩充性,另外,基类是虚函数,派生类同名函数也会变成虚函数。指向基类的指针在指  向派生类对象时可以调用派生类。 2、虚析构函数:基类的析构函数时虚析构函数时,派生类的析构函数也自动成为虚析构函数,函数名不同也没关系,采用虚析构函数后,系统就会先调用派生类的析构函数再调用基类的析构函数,而不是直接调用基类的析构函数了。
C++ | 实验八 | 虚函数和抽象类
【项目1:形状类族中的纯虚函数】 定义抽象基类Shape,由它派生出3个派生类:Circle(圆形)、Rectangle(矩形)、Triangle(三角形)。在主函数中分别求出一个圆形、一个矩形和一个三角形的面积。 #include &amp;lt;iostream&amp;gt; using namespace std; const float PI = 3.14; class Shape { ...
c++虚函数纯虚函数抽象类浅析
要说虚函数,首先要讨论为什么要用到虚函数,现在我们模拟一个这样的场景,在现实生活中有各种各样的车子,每种车有不同的平均速度,然后我们让几种车辆在一条马路上跑起来:#include<iostream> using namespace std;class car { public: void run() { cout<<"以5m/s的速度行驶"<<endl; }
C++多态性,虚函数,重载,抽象类
1,C++多态性,虚函数,重载,比较有意思,,,,,, 在面向对象的程序中,当不同的对象接受到相同的消息产生不同的动作,这种性质称为多态性。
多态,虚函数,纯虚函数 , 虚析构函数 ,抽象类
多态:是对于不同对象接收相同消息时产生不同的动作。C++的多态性具体体现在运行和编译两个方面:在程序运行时的多态性通过继承和虚函数来体现;在程序编译时多态性体现在函数和运算符的重载上; .. 虚函数:在基类中冠以关键字 virtual 的成员函数。 它提供了一种接口界面。允许在派生类中对基类的虚函数重新定义。 虚函数是运行时多态,若某个基类函数声明为虚函数,则其公有派生类将定义与其基类虚函数原型
父类虚函数与子类虚函数的调用问题
rn[code=C/C++]rnclass Arnrn ...rn virtual void doit()rn rn;rnrnclass B : public Arnrn virtual void doit()rn rn XXX; //语句1rn YYY; //语句2rn ZZZ; //语句3rn rn;rnrnvoid main()rnrn A *pa = new A();rn pa->doit(); // 调用的是父类or子类的doit函数 ?rn[/code]rnrnrn  调用的是父类还是子类的虚函数?rnrn pa->doit() 这句会执行B中的doit代码吗?rn
虚函数中调用虚函数的性能问题
一个比较大型的系统中,基线实现中一个性能热点的虚函数调用了另一个虚函数。rn在新的实现中,仅仅取消了这样的二级虚函数调用,整体性能提升2倍。rnrn但性能变化背后的原理,并不太清楚。rnrn不知大家有什么意见吗?
关于多重继承中有虚函数时的调用问题
(1)多重继承的派生类中的内存结构是怎么样的?如果所继承的两个类都有虚表那它的虚表是怎样呢?rn(2)多重继承的虚函数是怎么实现的呢?比如下面的例子:rn[code=C/C++]rnclass Brnrnpublic:rn virtual void print()rn rn cout<<"printB"<print();//调用虚表的第一个函数rn c->test();//也应该是调用虚表的第一个函数吧,和上面的不冲突吗?rn delete b;rn delete c;rn return 0;rnrn[/code]rnrn不知道我说的对不,希望指教一下.
关于指向基类指针调用子类虚函数的问题
我现在有一个基类相当于接口rninterface A rn rn virtual void fun() = 0;rnrnrn子类rnclass B: public Arnrn virtual void fun()rn rn rnrnrnclass C: public Arnrn virtual void fun()rn rn cout << "nihao";rn rnrnrn现在我想这样调用:rnmain ()rnrn A a = new B();rn // 如何实现 a->fun();实际上去调用C::fun()rnrnrn在线等高手解答
关于子类调用父类的虚函数(protected:)的问题?
我有一个类,例如:rnrnclass basernrnrnvirtual void onPress();//写一个响应键盘的函数rnrnrnclass subclass : public basernrnvirtual void onPress()rnrnrnvoid subclass::onpPress()rnrnif()rn//写一个判断的过程,比方说,输入是“1”,就调用这个过程,rnelse return (base*)this->onPress //返回父类的虚函数,将this指针转化rnrn想法大概就是这样,但编译不起来啊,我的环境是eclipse cdt。求救。rnrn分不多,学习交流为主,谢谢大家。
相关热词 c#部署端口监听项目、 c#接口中的属性使用方法 c# 昨天 c#func链接匿名方法 c#怎么创建文件夹 c#从键盘接收空格 c#da/ad c#部门请假管理系统 c#服务器socket c# 默认的访问修饰符