2017-01-09 2 views
-1

다른 클래스와 객체를 초기화 : 가 파생로 초기화되고 않다면 'PBA'는 자료 객체 왜 http://www.cplusplus.com/doc/tutorial/typecasting/#dynamic_cast나는이 예제를 보았다

(...) 
class Base { virtual void dummy() {} }; 
class Derived: public Base { int a; }; 
(...) 
Base * pba = new Derived; 
Base * pbb = new Base; 
(...) 

? 왜 파생 된 객체로 만들지 않겠습니까?

Derived * pba = new Derived; // use this instead 

그냥 C++ 일입니까?

+2

* 다형성 *의 예입니다. 꽤 광범위한 주제이므로 충분히 정교하게 대답 해 줄 것을 기대할 수는 없습니다 (여기에 몇 가지 중복이 있습니다). – Downvoter

+0

그리고 dynamic_cast의 예입니다. _Derived * pba = new Derived; _ 이 줄에는 의미가 없습니다. _pd = dynamic_cast (pba); _ –

+1

[세트에 고양이와 개가 모두있는 경우] (https : //en.wikipedia .org/wiki/Polymorphism_ % 28computer_science % 29 % 23Subtyping),이 세트의 모든 동물을 소리 내고 싶다면 각 동물마다'Animal :: talk()'를 호출하면됩니다. 그러나이 호출은 동물의 실제 클래스에. – Dialecticus

답변

1

pbapbb는 객체입니다하지만 그들은 그래서 당신은 그 기본 포인터가 같은 클래스 또는 파생 클래스 객체를 가리킬 수 있습니다 의미 다형 포인터 사용 코드에 입력 한 기본 클래스 Base의 포인터.

  • 객체는 새로운 것이 아니다 PBB로 만들거나 자신 PBA,이 예제를 고려하십시오

    포인터 PBA 및 PBB 따라서 클래스를베이스의 객체를 할당되거나 파생 될 수 있도록 런타임에
    #include <string> 
    #include <iostream> 
    using namespace std; 
    
    
    class Base 
    { 
        public: 
         virtual void Print() const { cout << "Base print()" << endl;} // virtual function 
         void Greet()const {cout << "in Base Say: hello!" << endl;} 
    }; 
    
    class Derived : public Base 
    { 
        public: 
         void Print() const { cout << "Derived print()" << endl;} // ovrode the base member pritn() 
         void Greet()const {cout << "in Derived Say: hello!" << endl;} 
    }; 
    
    int main() 
    { 
    
        Base* pba = new Derived; 
    
        pba->Print(); // Derived print() 
        pba->Greet(); // in Base Say: hello! ??? because Greet() is not virtual 
    
        Base* pbb = new Base; 
    
        pbb->Print(); // Base print() 
        pbb->Greet(); // in Base Say: hello! 
    
        return 0; 
    } 
    

    가상 멤버 함수가 그에 따라 호출됩니다.