생성자는 소멸자는 가상 함수 내에서 발생 다형성 (polymorphic)로 정의 할 수있다

여부 생성자는 가상 함수가 될 수 있습니까?
생성자 가상 함수가 될 수없는
가상 함수 테이블에 대한 포인터를 지정하여에 -C ++ 다형성 완료된 후 가상 함수 테이블 포인터가 컴파일러에 의해 생성되고, 또한 컴파일러에 의해 초기화된다. 가상 함수 테이블 포인터의 어떤 시간을 초기화?
- 생성자가 실행 된 후, 가상 함수 테이블 포인터가 제대로 초기화됩니다

소멸자는 가상 함수가 될 수 있습니까?
-이 디자인 클래스 소멸자가 가상 선언 할 때 권장

사용법 #include <iostream> 
사용법 #include < 문자열 > 사용하여 네임 스페이스 표준을; 수업 자료 
{ 공개 : 
    자료 () 
    { 
        cout을 << " 자료 () " << endl의; 
    } ~ 자료 () 
    { 
        COUT << " ~ 자료 () " << ENDL; 
    } 
}; 클래스 파생 : 공개 자료 
{ 공개 : 
    파생 () 
    { 
        cout을 <

 




     




" 제 () 유래 " << ENDL; 

    }


     ~ 파생 () 
    { 

        COUT << " ~ 파생 () " << ENDL; 
    } 
}; 


INT () 메인 
{ 
    자료 * P = 새로운 새로운 파생 (); 

    // ... 

    상기 p 삭제; // 여기에 우리가 기대는 소멸자의 서브 클래스를 호출 한 다음 부모 클래스의 소멸자를 호출하는 것입니다. 파생 ~ () ~ 자료 () : 즉 인쇄하는 것이 바람직하다 

    반환  0 ; 
}

 

 여기에 단지 부모 클래스의 소멸자를 호출합니다.

삭제 P, 부모 클래스를 제거하려면이 시간이 포인터, 소멸자는이 경우, 컴파일러 직접 포인터 P의 종류에 따라 소멸자를 호출 결정하고, 따라서 직접 호출, 가상 선언되지 부모 클래스의 소멸자

如果将父类的析构函数声明为virtual,编译器就不会简单暴力的根据指针p的类型来调用父类的析构函数还是子类的析构函数。这时它又是怎样处理的?
由于析构函数是虚函数,所以在执行delete p的时候,编译器根据指针所指向的实际对象来决定如何调用析构函数。这是什么,多态啊。这就是将虚函数声明为虚函数的意义。

class Base
{
public:
    Base()
    {
        cout << "Base()" << endl;
    }

    virtual ~Base()
    {

        cout << "~Base()" << endl;
    }
};

在工程开发中,通常将父类中的析构函数声明为虚函数,如果不这样做,有可能会发生内存泄露。因为它会跳过子类析构函数的调用,当子类析构函数中有释放内存的操作时,就发生内存泄露了。

在构造函数中不可能发生多态行为
-在构造函数执行时,虚函数表指针未被正确初始化
析构函数中不可能发生多态行为
-在析构函数执行时,虚函数表指针已经被摧毁

构造函数和析构函数中不能发生多态行为,只能调用当前类中定义的函数版本。

#include <iostream>
#include <string>

using namespace std;

class Base
{
public:
    Base()
    {
        cout << "Base()" << endl;

        func();
    }

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

    virtual ~Base()
    {
        func();

        cout << "~Base()" << endl;
    }
};


class Derived : public Base
{
public:
    Derived()
    {
        cout << "Derived()" << endl;

        func();
    }

    virtual void func()
    {
        cout << "Derived::func()" << endl;
    }

    ~Derived()
    {
        func();

        cout << "~Derived()" << endl;
    }
};


int main()
{
    Base* p = new Derived();

    // ...

    delete p;

    return 0;
}

 

추천

출처www.cnblogs.com/-glb/p/11973480.html