c++基类对象如何调用子类函数

2024-12-14 04:27:51
推荐回答(2个)
回答1:

你是只调用子类自己的函数吗?

#include
using namespace std;

class B0
{
public:
virtual void display()
{
cout<<"B0"<}
};
class B1:public B0
{
public:
void display()
{
cout<<"B1"< }
void displayB1()
{
cout<<" My is B1"< }
};
class D1:public B1
{
public:
void display()
{
cout<<"D1"< }

};

void fun(B0 * ptr)
{
ptr->display();
}
void funB1(B1 *ptr)
{
ptr->displayB1();
}

int main()
{
B0 b0,*p;

B1 b1;
D1 d1;

p=&b0;

fun(p);

p=&b1;

fun(p);
funB1((B1 *)p); //调用子类函数

p=&d1;

fun(p);
return 0;
}

回答2:

//动态联编与虚函数。
//动态绑定联编工作在程序运行时执行,在程序运行时才确定将要调用的函数。虚函数是动态绑定的基础。
//是非静态的成员函数。
//在类的声明中,在函数原型之前写virtual。
//virtual 只用来说明类声明中的原型,不能用在函数实现时。
//具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。
//本质:不是重载声明而是覆盖。
//调用方式:通过基类指针或引用,执行时会根据指针指向的对象的类,决定调用哪个函数。

#include

class B0 //基类B0声明
{
public:
virtual void display() //虚成员函数
{
cout<<"B0::display()"< }
};
class B1: public B0 //公有派生
{
public:
void display()
{
cout<<"B1::display()"< }
};
class D1: public B1 //公有派生
{
public:
void display()
{
cout<<"D1::display()"< }
};

void fun(B0 *ptr) //普通函数,用一个动态指针指向一个暂时不确定的函数
{
ptr->display();
}

void main() //主函数
{
B0 *p; //声明基类指针,对所有继承类都适用
B0 b0; //声明基类对象
B1 b1; //声明派生类对象
D1 d1; //声明派生类对象
p=&b0;
fun(p); //调用基类B0函数成员
p=&b1;
fun(p); //调用派生类B1函数成员
p=&d1;
fun(p); //调用派生类D1函数成员
}