C++ 虚函数 派生类的调用
来源:互联网 发布:淘宝众筹logo 编辑:程序博客网 时间:2024/05/29 18:03
#include <iostream>using namespace std;class A{public:virtual void print(){cout<<"a"<<endl;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////virtual void print(int){//当没有这一部分时,下面调用类B的带参成员函数时就会报错,为什么?cout<<"这是类A自己定义的一个函数!"<<endl;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////};class B:public A{//自己定义一个函数,并输出结果???public:void print(int){cout<<"这是类B自己定义的一个函数!"<<endl;}};class C:public A{public:void print(){cout<<"c"<<endl;}};class D:public A{public:void print(){cout<<"d"<<endl;}};int main(){A a;B b;C c;D d;A *p=&a;A *p1=&b;A *p2=&c;A *p3=&d;p->print();//p1->print();p1->print(1);//'print' : function does not take 1 parameters?p2->print();p3->print();return 0;}程序运行出现错误:(代码p1->print(1)所在行)
'print' : function does not take 1 parameters?原因在于此带有参数的函数没有在类A中出现,是类B所定义的一个函数。当函数运行下列语句:
p->print();p2->print();p3->print();
时,发生了动态绑定,非别调用类A、B、C的成员函数print(),而他们都存放在一个虚函数列表中(此处注意:基类A中print()为虚函数,则派生类中的print()函数默认为虚函数!!!),可以被类A定义的指针访问,而类B中print(int)成员函数不是继承类A而来,不问虚函数,因此不会出现在虚函数列表中,也就无法被类A所定义的指针在程序运行时动态绑定,无法访问,因此,出现运行错误。
修改方法:可以将
A *p1=&b;改为:
B *p1=&b;即可。或者:如源代码中,加入两行///线中函数print(int)的定义,但这时,通过指针调用类B中print(int)就跟调用print()函数的道理相同了。
- C++ 虚函数 派生类的调用
- 派生类构造函数的调用顺序
- 虚基类和派生类的函数调用
- 派生类构造函数的调用顺序
- 派生类构造函数和析构函数的调用顺序(C++)
- 抽象类 纯虚函数 虚函数 派生类 派生类对象 基类对象 ——调用顺序,用基类调用派生类的方法
- c++,派生类无法调用基类构造函数
- 【C++】基类和派生类构造函数的调用顺序
- C++虚函数的陷阱--派生类对象的基类函数调用基类虚函数出错
- C++派生类函数调用基类的函数
- 类派生的时候构造函数的调用
- 关于基类构造函数调用虚函数实际调用的不是派生类的问题的原因
- 派生类调用基类的构造函数
- 派生类中调用基类的构造函数
- 基类与派生类的构造函数调用问题
- C++基类与派生类的函数调用情况
- 派生类和基类的函数调用
- C++基类与派生类的函数调用情况
- drools的简单demo-廉价房申请单
- 设计模式六大原则(2):里氏替换原则
- C语言main函数
- 如何有效率地使用时间
- jdbc事物处理
- C++ 虚函数 派生类的调用
- 刚刚写了一个关于java中抽象类和接口的示例
- avi文件分析
- c++参数类型的识别(STL)
- 深入理解C语言——来自酷壳
- 正则表达式
- 简介如何查看执行计划以及执行计划的准确性
- I/O模式及SOCKET编程中的阻塞/非阻塞模式
- 网站目录是提升网站权重的好方法