C++虚函数问题,子类对象实例化父类对象,怎么不调用子类的函数?如下题

#include<iostream>
using namespace std;
class A
{
public:
void virtual print()
{
cout<<"A::print()"<<endl;
}
};
class B :public A
{
public:
void virtual print()
{
cout<<"B::print()"<<endl;
}

};
class C:public B
{
public:
void virtual print()
{
cout<<"C::print()"<<endl;

}

};
void print(A a)
{
a.print();
}

void main()
{
A a;
B b;
C c;
A *d =&a;
B *e=&b;
C *f=&c;
a.print();
b.print();
c.print();
d->print();
e->print();
f->print();
print(a);
print(b);
print(c);
getchar();
}

为什么最后三个输出都一样?而不是输出A:print() B:print() C:print()?

这个涉及到动态绑定的问题,按照C++primer的说法,只有调用对象的应用或者指针时,使用虚函数才能实现动态绑定。
将部分代码修改一下,
void print(A* a) //change too pointer
{
a->print();
}

int main()
{
A* a = new A(); //pointer
B* b = new B(); //pointer
C* c = new C; //pointer

print(a);
print(b);
print(c);
}
就OK了。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-09-03
最后一个参数既不是指针也不是引用,所以不会多态调用
第2个回答  2013-09-03
首先virtual应该放在void前面
print(a);print(b);print(c);后面都有参数,属于重载print(A a);
当然全部调用a.print();全部都输出A::print()

...用父类指针调用虚函数,问调用的是子类的函数还是父类的函数,为何...
如果是虚函数,是可以通过基类的指针调用子类的函数的。如果不是虚函数基类指针就只能调用基类函数

C++中父类和子类的成员函数同名同参数同返回只是父类里面是虚函数,子类...
没有问题,这就是虚函数的作用,子类中可以override(重写)父类中的虚函数,给出子类自己的实现方法,子类中其实省略了父类函数声明前的virtual,子类中加上virtual也是没有问题的,可有可无。

C++中父类方法中可以调用子类的方法吗?
不可以。继承实际上是将父类中的成员拷贝一份,添加到子类中。这个过程对父类本身没有造成改变。也就是父类中是没有子类的方法的,也就无法调用了。在一种特殊情况下,可以用父类的指针指向子类对象,然后用这个指针可以调用子类中的函数。这属于多态的范畴,实际上还是子类对象调用子类方法,与题主给...

c++中 子类对象与父类对象的内存关系
但是对于创建的B对象来说,他的前半部分相当于一个A对象,然后紧挨着下面是自己的数据成员,如下图:

c#子类继承父类,在调用子类的构造函数的时候首先会调用父类的构造函数...
执行子类构造函数不可能不执行父类的构造函数。当你实例化一个子类对象时,他会先执行System.Object中的构造函数,然后再执行父类的构造函数,最后执行子类的构造函数。要不执行父类的某个构造函数,只有你在子类中重载一个新的构造函数。

为什么我的建立了一个父类对象数组却无法调用子类的方法
父类没定义这个方法 只能通过转换为子类对象来 调用 (Student)persons[i].set子类某方法()百度这个 java父类调用子类方法

c++ OnRButtonDblClk()函数的一个问题
虚函数的机制三言两语很难描述。基本上你可以理解为子类重写OnRButtonDblClk 会在子类中覆盖父类该函数。因此如果子类的对象调用该函数,父类的函数得不到调用。如果要调用父类的函数,需要显示的调用。ParentClass::Function(..)这是一种常见的编程模式。把公有的部分放到父类函数中。

C++父类中声明了一个虚函数以后 是不是在子类 以及子类的子类中 都要...
基类声明虚函数只是提供一个接口,也就是实现多态的关键,子类基本都要继承的,如果有一个子类不需要实现这个函数,说明你的继承关系有问题,最好改变一下继承体系

C++问题?
当调用子类的函数A时,实际的运行顺序如下:子类的函数A被调用。子类的函数A内部会调用基类的函数B。由于基类的函数B是虚函数,因此会根据对象的实际类型来确定要调用的函数。由于子类重写了基类的函数B,所以实际会调用子类的函数B。子类的函数B执行完毕后,控制流回到子类的函数A,继续执行子类函数A中的...

C++父类中有纯虚函数,在子类的子类中也需要实现吗?
假设没有父类或者子类的实例对象,能够不实现父类的虚函数。(3)假设把虚函数写成纯虚函数,也就不须要实现了。也没不会发生上述讨论。子类中实现了,子子类就不用实现。子类没实现的话,子子类就可能需要实现。反正没有实现这个=0的函数的类是无法创建对象的。所以要实例化的类就要实现。

相似回答