【发布时间】:2020-07-21 09:43:09
【问题描述】:
我的测验中有这个问题。能解释一下吗?
指向基类的指针可以用派生的地址初始化 上课,因为______。
正确答案是“指针从派生到基的隐式转换”。
我有一些与此代码相关的问题:
#include <iostream>
using namespace std;
class Base
{
protected:
int x;
public:
Base(){};
Base(int x1): x(x1) {};
void show()
{
cout<<"x = "<<x<<endl;
}
virtual void printData()
{
cout<<"x = "<<x<<endl;
}
};
class Derived: public Base
{
int y;
public:
Derived(){};
Derived(int x1, int y1): Base(x1), y(y1) {};
void showXY()
{
cout<<"x = "<<x<<endl;
cout<<"y = "<<y<<endl;
}
void printData()
{
cout<<"x = "<<x<<endl;
cout<<"y = "<<y<<endl;
}
};
int main()
{
Base *d1 = new Derived(1,2);
// d1->showXY(); gives error in running a derived class function
d1->show(); // runs a base class function
d1-> printData(); // runs a virtual (overriden) derived class function
d1->~Base(); // uses a base class destructor
}
请解释一下这个概念。它是基类对象还是派生类对象?因为它运行基类函数,但是如果有覆盖,那么它会运行派生类函数,但在运行纯派生类函数时会出错。
【问题讨论】:
-
你应该阅读虚函数和多态性
-
d1->~Base(); // uses a base class destructor-- 不要那样做。缺少的是基类的析构函数不是virtual。你应该在Base中有一个虚拟析构函数,那行代码应该是delete d1;。 -
@PaulMcKenzie 好的,但它是基类对象还是派生类对象?
标签: c++ class object pointers c++17