2012-09-06 89 views
1
#include <stdio.h> 

class A { 
public: 
    virtual void print(); 
    A(); 
}; 

class B :public A { 
public: 
    void print(); 
    B(); 
}; 

class C :public B { 
public: 
    void print(); 
    C(); 
}; 

A::A(){ 
} 

B::B(){ 
} 

C::C(){ 
} 

void B::print() { 
    printf("From B\n"); 
} 

void C::print() { 
    printf("From C\n"); 
} 

int main() { 
    B* object = new C; 
    object->print(); 

    return 0; 
} 

當我嘗試編譯此C++文件時,出現以下錯誤。無法弄清原因。我嘗試閱讀SO上類似的未定義的vtable問題。未定義的vtable C++

/tmp/ccpOkVJb.o: In function `A::A()': 
test1.cpp:(.text+0xf): undefined reference to `vtable for A' 
/tmp/ccpOkVJb.o:(.rodata._ZTI1B[_ZTI1B]+0x10): undefined reference to `typeinfo for A' 
collect2: error: ld returned 1 exit status 
+0

你應該更加小心 – Maxwe11

回答

7

如果A::print()並不意味着實現,其聲明爲純:

class A { 
public: 
    virtual void print() = 0; 
    A(); 
}; 

否則,執行它。

2

需要聲明A::print()爲純虛擬的,或者提供一個實現:大概

class A { 
public: 
    virtual void print()=0; 
    A(); 
}; 

class A { 
public: 
    virtual void print() {} 
    A(); 
}; 
3

你宣稱有應該是一個A::print方法來實現(你意味着使用= 0進行純虛擬化),但是你沒有實現它。

由於第一個實現的虛擬方法使得編譯器實例化了vtable,並且你沒有在A中實現任何東西,所以A的vtable缺失,導致undefined reference to 'vtable for A'

+0

更正一些編譯器。 –

+1

@PeteBecker是的,所有編譯器的實現細節和絕對不是真實的,但在這種情況下錯誤消息的原因。 –

+0

+1用於解釋爲什麼錯誤消息是它是什麼。 – sepp2k

相關問題