谁知道C++虚拟函数重写机制为什么这么设计?

来源:百度知道 编辑:UC知道 时间:2024/06/15 13:03:01
谁知道C++虚拟函数重写机制为什么这么设计?
我定义一个非虚拟函数,也可以保证指针是哪个对象,就具体调用哪个类的成员函数阿。
class base
{
public:
void function1(){cout << "base"<<endl;;}
}
class Derived
{
public:
void function1(){cout << "derived"<<endl;}
}

CBase *p = new CDerived;
p->function1();
还是会执行CDerived::function1()的内容,为什么要多写一个virtual呢?
汗,我确实写错了,不过是笔误,就是按照2楼那样写,CDerived是从CBase那儿继承来的。

你这样的调用的是类CDerived中从CBase中继承过来的基类部分的数据,而不是调用的CBase中的数据部分.另外你这样写的时候CBase *p = new CDerived;
p->function1(); 最好把基类的析构函数定义成virtual的,要不然在你delete CBase 时不会调用CDerived的析构函数的...

那是因为你的代码写错了,你这时候加virtual,再比较一些他们的结果。

#include <iostream>
using namespace std;

class CBase
{
public:
void function1(){cout << "base"<<endl;;}
};

class CDerived : public CBase
{
public:
void function1(){cout << "derived"<<endl;}
};

int main()
{
CBase *p = new CDerived();
p->function1();
return 0;
}

补充:
-----------------------------------------------
不加virtual会运行CBase::function1(),加了会运行CDerived::function1().