class-关于const虚函数问题,求解

问题描述

关于const虚函数问题,求解

class Base
{
public:
    virtual void print() const = 0;
};

class Test : public Base
{
public:
    void print() {cout << "Test::print()" << endl;}
    void print() const { cout << "Test::print() const" << endl; }
};

void main()
{
    Base* pChild = new Test();
    pChild->print();

    Test* p2 = new Test();
    p2->print();

}

为什么输出的是:
Test::print() const
Test::print()

解决方案

void print() const对virtual void print() const = 0;构成覆盖,所以通过Base指针访问print,访问的是void print() const,输出Test::print() const
通过派生类调用print,同时有两个版本,一个是基类继承的,一个是派生类自己的,根据就近原则,访问后者,所以输出Test::print()

解决方案二:

第一个是多态,通过父类指针调用子类的对应的虚函数
第二个就是纯粹的类成员函数调用

时间: 2024-08-23 19:37:00

class-关于const虚函数问题,求解的相关文章

c++-他们说这是关于虚函数的,可是我看不懂,求解。

问题描述 他们说这是关于虚函数的,可是我看不懂,求解. 解决方案 c++知识点:这个类A 是一个含有虚函数的类,那么此时运行时编译器会为他生成虚表,并且在A类的对象内存的起始位置加了虚表的首地址,所以此时对象的大小会比 不含有虚函数的类对象多了4个字节(32位机下),因为编译器需要通过这个指针去运行时寻找虚表. 然后看看你的代码: 在你的a对象的前四个字节存的是虚表的首地址(32位机,64位为8字节), 此事声明了一个函数指针类型,fp, 然后定义一个此类型的变量myfunc 然后myfunc

C++中的纯虚函数(pure virtual) 和抽象基类(abstract base class)

纯虚函数(pure virtual), 是一个基类中的方法, 仅仅是声明, 而不包括定义, 是一个泛化概念(general concept); 是把相应的虚函数, 末尾添加"=0",该虚函数就变为纯虚函数, 可以不用添加定义; 如果是其他虚函数, 即使不使用, 也必须定义(define); 包含纯虚函数的基类, 是抽象基类(abstract base class),不能定义(define)对象(object), 仅可以作为继承使用; 代码: /* * CppPrimer.cpp * *

C++中如何在容器中使用继承和虚函数

容器不支持混合类型, 如果直接把派生类对象, 存入基类容器中, 则无法使用派生-基转换(derived-base conversion); 因为转换只能发生在指针和引用 过程中, 不能发生在 对象直接赋值, 如果是直接转换, 则会产生截断(sliced down); 即派生类部分被切除, 只留下基类部分; 所以存入容器中的派生类 输出为基类部分 的虚函数; 如果想在容器中, 进行继承, 则需要使用指针, 包括智能指针(如:shared_ptr<>), 则会输出派生类的覆写(override)版

C++:虚函数(virtual function)缺省参数的异常表现及正确使用

避免定义基类(base class)虚函数的缺省参数, 如果基类虚函数包含缺省参数, 派生类不要重新定义, 会产生异常; 虚函数(virtual)是动态绑定(dynamically bound),缺省参数是静态绑定(statically bound). 如果派生类(derived class)重新定义缺省值, 实例化, 执行函数正常; 但在动态绑定时, 会出现,执行基类的缺省参数, 却是派生类的行为, 这样的异常举动. talk is cheap, show you the code. 注意观察

C++:阻止派生类(derived class)重新定义虚函数(final&amp;amp;sealed)

阻止派生类重新定义虚函数, 在java和C#中可以很简单的实现(finale&sealed), 但在C++中则需要使用public继承+复合(composition)的方法; 注意: 使用私有继承(private), 无法实现此要求. 如: /************************************************* File: test.cpp Copyright: C.L.Wang Author: C.L.Wang Date: 2014-04-11 Descripti

MFC浅析(7) CWnd类虚函数的调用时机、缺省实现 .

1. Create 2. PreCreateWindow 3. PreSubclassWindow 4. PreTranslateMessage 5. WindowProc 6. OnCommand 7. OnNotify 8. OnChildNotify 9. DefWindowProc 10. DestroyWindow 11. PostNcDestroy CWnd作为MFC中最基本的与窗口打交道的类,完成了大部分窗口管理任务.同时提供了很多虚拟函数,这些虚拟函数在适当的地方提供了供派生类参

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

问题描述 关于c++抽象类的问题,调用虚函数 #include#includeusing 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

静态联编,动态联编,类指针之间的关系,虚函数与多态性,纯虚函数,虚析构函数

1.静态联编,是程序的匹配,连接在编译阶段实现,也称为早期匹配.重载函数使用静态联编. 2.动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编.switch语句和if语句是动态联编的例子. #include<iostream> void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void

【C/C++学院】0823-静态联合编译与动态联合编译/父类指针子类指针释放/虚函数/纯虚函数概念以及虚析构函数/抽象类与纯虚函数以及应用/虚函数原理/虚函数分层以及异质链表/类模板的概念以及应用

静态联合编译与动态联合编译 #include <iostream> #include <stdlib.h> //散列 void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void main() { ///auto p = go;编译的阶段,静态联编 void(*p1)(char *s