new-关于虚析构函数的问题

问题描述

关于虚析构函数的问题

#include
using namespace std;
class A
{
public:

A(){cout << "A" << endl;}
virtual ~A(){cout << "~A" << endl;}
};
class B : public A
{
public:
B(){cout << "B" << endl;}
~B(){cout << "~B" << endl;}
};
int main()
{
A *p = new B;
delete p;
system("pause");
return 0;
}

A *p = new B;这句为什么不new A呢?
这样写有没有什么现实需要?
有什么情况会必须这样写嘛?

解决方案

也可以写 A *p = new A,这样语法上是没有错的。直接 new A 是不会执行 B 的构造函数。

只是代码上来讲,
(1)new B 会执行 B 和 A 的构造函数,类的继承
(2)这应该是讲类的多态,p 可以指定 A 的对象,也可以指向 B 的对象。原因是 B 是 A 的子类!

解决方案二:

多态啊。
A *p = new B;
就是最常见的多态做法,用基类指针指向子类对象,这样可以实现多态调用

时间: 2024-08-01 18:25:54

new-关于虚析构函数的问题的相关文章

c++-纯虚析构函数的内联实现

问题描述 纯虚析构函数的内联实现 C++ 纯虚析构函数在VS里面可以内联实现,如: class CBase { public: CBase(); virtual ~CBase() = 0 {}; } 这样写在VS里没有问题,但在Eclipse里面这样写C++编译通不过 解决方案 这是C++ 11的写法吧,你用的编译器不一定支持. 解决方案二: 估计是编译器的版本问题,你查查那两个IDE编译器的具体版本的信息. 解决方案三: 编译器不支持,那你就只能分开写了,写成非inline方式 解决方案四:

请教大家一个在虚析构函数存在时,C++虚函数表的问题

问题描述 请教大家一个在虚析构函数存在时,C++虚函数表的问题 下面是在下的代码: #include <iostream> using namespace std; class Point { private: int X; int Y; public: Point() {} Point(int x, int y) : X(x), Y(y) {} const int getX() { return X; } const int getY() { return Y; } virtual ~Poi

C++虚析构函数的使用分析_C 语言

在C++中,不能声明虚构造函数,但可以声明虚析构函数.多态性是指不同的对象对同一消息有不同的行为特性.虚函数作为运行时多态性的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此虚构造函数是没有意义的.析构函数的功能是在该类对象消亡之前进行一些必要的清理工作,析构函数最好都是virtual的.首先解释一下虚构函数和指针之间是如何交互的,以及虚析构函数的具体含义.例如以下代码,其中SomeClass是含有非virtual析构函数的一个类:SomeClass *p= new SomeCla

C++语言基础 例程 虚析构函数

贺老师的教学链接  本课讲解 问题的由来 #include <iostream> using namespace std; class Point { public: Point( ) { } ~Point() { cout<<"executing Point destructor"<<endl; } }; class Circle:public Point { public: Circle( ) { } ~Circle( ) { cout<&

静态联编,动态联编,类指针之间的关系,虚函数与多态性,纯虚函数,虚析构函数

1.静态联编,是程序的匹配,连接在编译阶段实现,也称为早期匹配.重载函数使用静态联编. 2.动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编.switch语句和if语句是动态联编的例子. #include<iostream> void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void

【C/C++学院】0823-静态联合编译与动态联合编译/父类指针子类指针释放/虚函数/纯虚函数概念以及虚析构函数/抽象类与纯虚函数以及应用/虚函数原理/虚函数分层以及异质链表/类模板的概念以及应用

静态联合编译与动态联合编译 #include <iostream> #include <stdlib.h> //散列 void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void main() { ///auto p = go;编译的阶段,静态联编 void(*p1)(char *s

不用虚析构函数也不会造成内存泄漏的原因是什么?

问题描述 不用虚析构函数也不会造成内存泄漏的原因是什么? 代码如下: #include using namespace std; class Base { public : Base(){} virtual void fun(){ cout << "from Base :" << endl; } ~Base(){ cout << "from Base destructor:" << endl; fun(); } int

简要解读C++的动态和静态关联以及虚析构函数_C 语言

C++静态关联与动态关联.C++是怎样实现多态性的 在现实生活中,多态性的例子是很多的.我们分析一下人是怎样处理多 态性的.例如,新生被录取人大学,在人学报到时,先有一名工作人员审查材料,他的职责是甄别资格,然后根据录取通知书上注明的录取的系和专业,将材料转到有关的系和专业,办理具体的注册人学手续,也可以看作调用不同部门的处理程序办理入学手续.在学 生眼里,这名工作人员是总的人口,所有新生办入学手续都要经过他.学生拿的是统一的录取通知书,但实际上分属不同的系,要进行不同的注册手续,这就是多态.那

为什么c++基类不是虚析构函数,析构派生类对象也自动析构基类

问题描述 为什么c++基类不是虚析构函数,析构派生类对象也自动析构基类 测试环境:Win7 + VC++6.0 问题:如图,基类析构函数**不是**虚函数,但是析构派生类时,基类的析构函数也自动执行了,不是只有是虚析构函数才会自动析构基类么?? 解决方案 记得是虚的才是只执行子类不执行父类的吧. 解决方案二: 虚的才是只执行子类不执行父类 解决方案三: 虚基类的非虚基类优先于非虚基类的非虚基类 解决方案四: 子类析构,都会调用父类的.父类虚析构是为了多态的时候,能够正确调用子类的析构函数. 解决