#include<iostream>
#include<cstring>
class Base
{
char* base;
public:
Base()
{
base = new char[2];
strcpy(base, "1");
cout << "2";
}
~Base()
{
delete[]base;
cout << "3";
}
void Print()
{
cout << base;
}
};
class Derived :public Base
{
char* derived;
public:
Derived()
{
derived = new char[2];
strcpy(derived, "4");
cout <<"5";
}
~Derived()
{
delete[]derived;
}
};
int main()
{
Base* ptr = new Derived;
ptr->Print();
delete ptr;
return 0;
}
答案是2513
Base* ptr = new Derived; 是什么意思呀?Derived不是类的名称吗 为什么会被new创建出来呢?
还有ptr->Print();调用的为什么是基类中的函数呢?(输出的是1)
最后delete ptr; 又为什么调用的是基类的析构函数呢?析构不是派生类先调用吗?
麻烦各位看看解答一下疑惑,谢谢!!感激不尽!!
1、Derived是类名,也可以看作是变量的类型名,类比 int 来理解。new Derived就是在堆上创建一个Derived类的实例。Base* ptr = new Derived;就是用基类指针指向派生类对象。
2、Print()是基类的成员函数,而且不是虚函数,此时就是基类指针ptr调用基类函数Print()。
3、ptr是基类指针指向派生类对象,这种情况只会调用基类析构。可以理解为ptr认为它所指向的内存是一个基类实例,就只能看到基类的成员变量和函数,所以不会调用派生类析构。正常情况是派生类指针指向派生类对象,那么就先调用派生类析构再调用基类析构。