构造函数为虚函数

#include <iostream>
using namespace std;
class A
{
public:
    virtual ~A(){cout<<"A destructor---"<<endl;}
};
class B:public A
{
public:
    B(){cout<<"B----constructor---"<<endl;m_p=new char[10];}
    ~B(){cout<<"B destructor---"<<endl;}
private:
    char *m_p;
};
int main()
{
    A *p=new B;
    delete p;//会调用子类对象的析构,防止子类对象申请内存不被释放,我在想他这个为什么会调用基类析构函数,既然是多态
    getchar();
    return 0;
}
时间: 2024-10-09 07:39:22

构造函数为虚函数的相关文章

为什么 构造函数、内联函数、静态函数和友元函数不能是虚函数

构造函数为什么不能是虚函数 C++ 从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的.问题出来了,如果构造函数是虚的,就需要通过vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数.简单来说就是:虚函数的执行依赖于虚函数表.而虚函数表在构造函数中进行初始化工作,即初始化vptr,让他指向正确的虚函数表.而在构造对象期间,虚函数表还没有被初始化,将无法进行

为什么构造函数不能是虚函数

首先,我写了一个构造函数用virtual修饰的类A,代码如下: class A { public: virtual A() {} }; 运行结果:(我是在VS下运行的) 可以看出这样的代码编译时是有问题的. 为什么构造函数不能是虚函数呢? 这里你需要知道一个概念,那就是虚函数表vtbl,每一个拥有虚成员函数的类都有一个指向虚函数表的指针.对象通过虚函数表里存储的虚函数地址来调用虚函数. 那虚函数表指针是什么时候初始化的呢?当然是构造函数.当我们通过new来创建一个对象的时候,第一步是申请需要的内

C++类的构造函数不能为虚函数的原因

C++类的对象构造的时候,首先申请一片内存,然后调用构造函数进行初始化: 我们知道,存在虚函数的话,也会存在一个虚函数表vtable,而虚函数表示在什么时候产生的呢,当然是在调用构造函数之后产生的: 那么问题来了,如果构造函数为虚函数,此时的内存是一片空白,不存在该虚函数表vtable,那么无法找到该构造函数: 所以说,构造函数不能为虚函数. 对于析构函数而言,可以为虚函数,因为此时虚函数表早已建立:并且,常常析构函数都是虚函数.原因就是,通过基类指针在销毁对象的时候,可以正确的识别要销毁对象的

虚函数-构造函数-析构函数

在C++里面,虚函数的作用就是  实现 多态 构造函数可以是  虚函数,但是这样做没有多大意义,特别是在有继承关系的时候估计就不行了,没有继承关系的时候,这个类就不会被创建,编译应该是没有问题的, 析构函数 在有继承的时候,经常用虚函数,因为在  子类有实例的时候,如果让父亲的指针指向  子类的实例,而子类的实例中有new了新的地址空间,那么调用父亲的析构函数,如果父亲的析构函数不是虚的,那么只负责把父亲自己的指针回收,但是子类中new就没有回收:而如果析构函数是虚函数,那么首先是释放子类申请的

09 构造函数能调用虚函数吗?

[本文链接] http://www.cnblogs.com/hellogiser/p/whether-constructor-can-call-virtual-function.html [题目] 构造函数可以调用虚函数吗?语法上通过吗?语义上可以通过吗? [分析] 构造函数调用虚函数(virtual function),语法上可以通过(程序可以正常执行),但是语义上通不过(执行结果不是我们想要的) 请看以下代码 C++ Code 12345678910111213141516171819202

C++:构造函数和析构函数能否为虚函数

原文:http://blog.csdn.net/xhz1234/article/details/6510568 C++:构造函数和析构函数能否为虚函数? 简单回答是:构造函数不能为虚函数,而析构函数可以且常常是虚函数. (1) 构造函数不能为虚函数 让我们来看看大牛C++之父 Bjarne Stroustrup 在<The C++ Programming Language>里是怎么说的: To construct an object, a constructor needs the exact

C++里的构造函数为什么不能为虚函数

以下代码在编译时会出错,原因是构造函数不能为虚函数. 1 class Student { 2 public: 3 virtual Student() 4 { 5 this->dwNo = 0; 6 } 7 8 private: 9 int dwNo; 10 }; 那么构造函数为什么不能为虚函数呢? 这里你需要知道一个概念,那就是虚函数表vtbl,每一个拥有虚成员函数的类都有一个指向虚函数表的指针.对象通过虚函数表里存储的虚函数地址来调用虚函数. 那虚函数表指针是什么时候初始化的呢?当然是构造函数

31.C++-虚函数之构造函数与析构函数分析

1.构造函数不能为虚函数 当我们将构造函数定义为虚函数时,会直接报错: 首先回忆下以前学的virtual虚函数概念: 如果类定义了虚函数,创建对象时,则会分配内存空间,并且为该父类以及其所有子类的内存空间上额外分配一个虚函数表. 虚函数表的作用在于,存储每个类的相同的虚函数名,然后每一次虚函数调用,都会去虚函数表查找地址 分析: 假如构造函数是虚函数的话,由于对象开始还未分配内存空间,所以根本就无法找到虚函数表,从而构造函数也无法被调用.所以构造函数是不能成为虚函数. 2. 析构函数可以为虚函数

C++中虚函数

本文为博主学习虚函数时,结合网上博客和相关书籍所写.主要分为两部分:虚函数的定义要遵循的规则,虚函数表. 一.虚函数的定义要遵循的规则 1.如果虚函数在基类与派生类中出现,仅仅是名字相同,而形式参数不同,或者是返回类型不同,那么即使加上了virtual关键字,也是不会进行滞后联编的. 解读:派生类中根据需要对虚函数进行重定义是,格式要求有三点: (1)与基类的虚函数有相同的参数个数: (2)与基类的虚函数有相同的参数类型: (3)与基类的虚函数有相同的返回类型:或者与基类虚函数的相同,或者都返回