C++ 有没有可能通过父类指针调用子类的虚函数

如题所述

不可以向下调用派生类的成员包括虚函数

class Parent
{
public:
Parent(){};
virtual void foo_parent() = 0;// 纯虚函数
private:
};

class Son:public Parent
{
public:
Son(){};
virtual void foo_son(){ // 派生类虚函数
cout << "Foo of Son" << endl;
}
void foo_parent(){  // 重写父类的纯虚函数
cout << "Foo of Parent" << endl;
}
private:

};

int _tmain(int argc, _TCHAR* argv[])
{
Parent * p = new Son; // 定义父类类型的指针变量p,它指向子类。

p->foo_parent();
p->foo_son(); // 错误,父类类型的指针变量不可向下调用派生类自个的成员(包含虚函数)
delete p;

return 0;
}

温馨提示:内容为网友见解,仅供参考
无其他回答

C++中用父类指针指向子类实例,用父类指针调用虚函数,问调用的是子类的...
如果是虚函数,是可以通过基类的指针调用子类的函数的。如果不是虚函数基类指针就只能调用基类函数

c++实现多态时父类指针如何调用子类独有的数据成员?
实现多态时,C++允许父类指针调用子类独有的数据成员。此功能通过虚函数和动态类型识别(dynamic_cast)实现。首先,在父类中定义一个虚函数,该虚函数返回子类独有的数据成员。子类重写此虚函数,返回自己的数据成员。使用父类指针调用虚函数时,动态类型识别确定实际对象类型,返回正确数据。例如:c++ clas...

c++父类接口取子类并集还是交集
是交集。c++中,父类和子类虚函数都有对应的虚函数表,如果子类重写了虚函数,就会将新写的这个函数的地址放到他自己的表内,并且通过父类的指针指向子类所开辟的空间,这样就可以调用子类的方法。

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

C++问题: 通过怎样的方式父类的对象可以直接调用子类的成员...
不可以吧!如果实在想访问,可以通过虚函数方式进行访问,比如:class father { public:virtual void* getElementsAddr(){ return null;} };class child : public father { public:virtual void* getElementsAddr(){ return &element;} private:int element;} void main(){ father &cFather = child...

c++中的虚函数是什么?
C++中的虚函数是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多...

c++多态性是什么,有什么作用
简单地说就是子类里实现了父类的虚函数,父类的指针不仅可以调用自己的这个函数,同时也可以调用子类的这个虚函数,从而实现了多态。作用就是实现了动态联编,使程序运行效率更高,更容易维护和操作。

c++ 父类指针转换为子类指针后调用子类的成员函数,为什么可以调用成功...
父类指针指向子类对象,然后调用子类对象所继承(或改写)的父类方法,这就是面向对象的核心--多态 其实也好理解,子类对象的类型与其父类的类型是共通的,他就是从父类继承来的,如果把子类比父类新增的成员变量或成员函数去掉,他就是一个父类的对象,当然可以调用自己的方法 不过,一般多态不是楼主这么用的...

c++ 构造函数里可以调用虚函数吗
显然的是:当我们构造一个子类的对象时,先调用基类的构造函数,构造子类中基类部分,子类还没有构造,还没有初始化,如果在基类的构造中调用虚函数,如果可以的话就是调用一个还没有被初始化的对象,那是很危险的,所以C++中是不可以在构造父类对象部分的时候调用子类的虚函数实现。但是不是说你不...

C++中是不是每个类(有虚函数)都对应一个virtual function table?_百...
你理解的是对的,子类和父类各有一个虚函数表,并且虚函数指针也是指向各自的。子类先是从父类复制了一个虚函数表,如果子类对父类的虚函数进行了覆盖,则在子类的虚函数表将会用子类的函数地址覆盖父类的,如果没有覆盖,则还是使用父类的函数地址,这样就实现了多态。

相似回答