C++面试题1:构造函数和虚构函数中能否调用虚函数?

C++面试题1:构造函数和虚构函数中能否调用虚函数?

  • 构造函数跟虚构函数里面都可以调用虚函数,编译器不会报错。
  • C++ primer中说到最好别用
  • 由于类的构造次序是由基类到派生类,所以在构造函数中调用虚函数,虚函数是不会呈现出多态的
  • 类的析构是从派生类到基类,当调用继承层次中某一层次的类的析构函数时意味着其派生类部分已经析构掉,所以也不会呈现多态
  • 因此如果在基类中声明的纯虚函数并且在基类的析构函数中调用之,编译器会发生错误。
class Base
{
public:
    Base()
    {
        Fuction();
    }

    virtual void Fuction()
    {
        cout << "Base::Fuction" << endl;
    }
};

class A : public Base
{
public:
    A()
    {
        Fuction();
    }

    virtual void Fuction()
    {
        cout << "A::Fuction" << endl;
    }
};

// 这样定义一个A的对象,会输出什么?
A a;
首先调用应该是没有问题的,但是得到的结果呢?
很多人会说输出:A::Fuction A::Function
如果是按照上面的情形进行输出的话,那就是说在构造Base的时候,也就是在Base的构造函数中调用Fuction的时候,调用了子类A的Fuction,而实际上A还没有开始构造,这样函数的行为就是完全不可预测的,因此显然不是这样,实际的输出结果是:
Base::Fuction
A::Fuction

例子2:

#include <iostream>using namespace std;
class A
{
public:
    A()
    {
        cout << "A构造函数";
        Test();
    }
    ~A()
    {
        cout << "A析构函数";
        cout << "A::Test()" << endl;
    }
    virtual void Test()
    {
        cout << "A::Test()" << endl;
    }
};

class B:public A
{
public:
    B()
    {
        cout << "B构造函数";
        Test();
    }
    ~B()
    {
        cout << "B析构函数";
        Test();
    }
    virtual void Test()
    {
        cout << "B::Test()" << endl;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    A* pA = new B();    调用构造函数  输出A构造函数:A::Test() B调用构造函数B::Test()

    cout << "动态调用:";
    pA->Test();         原指针类型是PA,实际指针类型是B,由于是虚函数,所以按实际类型调用 B::Test(

    delete pA;     由于A的析构不是虚函数,所以按照原类型指针调用,如果在A的析构函数中加上virtual 则输出为B析构函数B::Test A析构函数A::Test
    return 0;
}

例子3:

#include<iostream>using namespace std;
class A
{
public:
    void virtual f()
    {
        cout<<"A"<<endl;
    }
};
class B : public A
{
    public:
    void virtual f()
    {
        cout<<"B"<<endl;
    }
};
int main ()
{
    A* pa=new A();
    pa->f(); 这个很明显A
    B* pb=(B*)pa;
    pb->f(); 这个强制将pa复制到pb,所以pb指向A
    delete pa,pb; 删除pa,pb所指向的地址,但是pa、pb指针并没有删除,悬浮指针
    pa=new B();
    pa->f();         B
    pb=(B*)pa;
    pb->f();         B
    return 0;
}
总结:虚函数根据指针实际类型调用,其他函数都是根据原类型调用。
时间: 2024-10-25 19:27:56

C++面试题1:构造函数和虚构函数中能否调用虚函数?的相关文章

C++中构造函数能调用虚函数吗?(答案是语法可以,输出错误),但Java里居然可以

环境:XPSP3 VS2005 今天黑总给应聘者出了一个在C++的构造函数中调用虚函数的问题,具体的题目要比标题复杂,大体情况可以看如下的代码: [cpp] view plain copy class Base { public: Base() { Fuction(); } virtual void Fuction() { cout << "Base::Fuction" << endl; } }; class A : public Base { public:

C++中为什么构造函数不能是虚函数,析构函数是虚函数

一, 什么是虚函数? 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离:用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略. 所谓虚函数就是多态情况下只执行一个,而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象,如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造,还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟

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

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

C++构造函数中调用虚函数

谈谈关于构造函数中调用虚函数的情况,仅讨论单继承,不考虑虚拟继承和多重继承. 测试平台:VS2013 + Win7X64 一个例子: #include <stdlib.h> #include <stdio.h> class Base { private: int __data; public: Base() { this->Func(); } public: virtual void Func() { printf("Base::Func"); } };

在构造函数和析构函数中调用虚函数------新标准c++程序设计

在构造函数和析构函数中调用虚函数不是多态,因为编译时即可确定调用的是哪个函数.如果本类有该函数,调用的就是本类的函数:如果本类没有,调用的就是直接基类的函数:如果基类没有,调用的就是间接基类的函数,以此类推.例如: #include<iostream> using namespace std; class A { public: virtual void hello(){cout<<"A::hello()"<<endl;} virtual void

条款9:绝不要在构造以及析构函数中调用虚函数

在构造以及析构函数期间不要调用virtual函数,因为这类调用从不下降到derived class中.例如说下面这个例子: 1 class Transaction{ 2 public: 3 Transaction(); 4 virtual void logTransactions()s const = 0; 5 //... 6 }; 7 Transaction::Transaction() 8 { 9 //... 10 logTransaction(); 11 } 12 class BuyTra

C++ 笔记(二) —— 不要在构造和析构函数中调用虚函数

ilocker:关注 Android 安全(新手) QQ: 2597294287 1 class Transaction { //所有交易的 base class 2 public: 3 Transaction(); 4 virtual void logTransaction() const = 0; //做出一份因类型不同而不同的日志记录 5 … 6 } 7 Transaction::Transaction() { 8 … 9 logTransaction(); 10 } derived cl

EC笔记,第二部分:9.不在构造、析构函数中调用虚函数

9.不在构造.析构函数中调用虚函数 1.在构造函数和析构函数中调用虚函数会产生什么结果呢? #include <iostream> using namespace std; class cls1{ public: cls1(){ newMake(); }; ~cls1(){ deleteIt(); }; virtual void newMake(){ cout<<"cls1 make"<<endl; } virtual void deleteIt()

详细讲解什么函数不能声明为虚函数

什么函数不能声明为虚函数? 一个类中将所有的成员函数都尽可能地设置为虚函数总是有益的. 但设置虚函数须注意: 1:只有类的成员函数才能说明为虚函数: 原因:普通函数(非成员函数)只能被overload,不能被override,声明为虚函数也没有什么意思,因此编译器会在编译时邦定函数. 2:静态成员函数不能是虚函数: 因为static属于class自己的,也必须有实体: 没有this指针,它无法进行对象的判别. 3:内联函数不能为虚函数: 原因: inline是编译时展开,必须有实体:内联函数就是