2014-02-26 56 views
0

所以,我有一個叫做A的類,帶有原型函數x。 B,CD是從A派生的,所以派生類具有函數x也是原型的。 現在我希望不是每個類都有定義的函數x。 在C++中可能如何?聲明在父類中,並在子中定義

+2

不要在'B','C'和'D'聲明'x'。 – juanchopanza

+0

你是什麼意思「不是每個類都有函數'x()'」?當使用對象'B','C'和'D'時,你想讓'x()'不可訪問嗎? – idanshmu

回答

0

你可能想x聲明爲純虛函數,例如:

virtual void x() = 0; 
+0

它是如何回答這個問題的? – idanshmu

+0

如果OP想要通過指向A的指針運行方法x(),並且(s)他不想在每個派生類中提供它,那麼必須將其定義爲虛擬來消除鏈接器錯誤。 – Kissiel

+1

如果在類「A」中將'x()'定義爲純虛擬,那麼這意味着您必須在所有派生類中實現'x()'。據我的理解,這與他的觀點相矛盾:*「我希望不是每個班級都有定義的功能」* – idanshmu

1

這是對OOP原則。繼承意味着一種關係。在你的例子中,B,CD是一種A。如果A有方法x,其他人也應該有。

如果事實並非如此,x是不是真正的A(但它的後裔之一)

的方法如果x應該從A唯一可替代,使其private

private: void x() {} 
0

假設你正在問什麼,因爲從A派生的每個類都將定義x。如果你要求的是B類,C類和D類是以A的形式實現的(即它們將利用A的功能但不能被認爲是A的一個實例),那麼你可以在B中指定A的受保護或私有繼承,C和D.

示例代碼使用這種方法可能是:

#include <iostream> 
class A 
{ 
    public: 
     void x() 
     { 
      std::cout << "Hello from A::x" << std::endl; 
     } 
}; 

class B : protected A 
{ 
    public: 
}; 

class C : protected A 
{ 
    public: 
    void x() 
    { 
     std::cout << "Hello from C::x" << std::endl; 
    } 
}; 

class D : public A 
{ 
    public: 
}; 

int main(int argc, char **argv) 
{ 
    //B instance_of_B; 
    //instance_of_B.x(); // Will cause a compiler error 
    C instance_of_C; 
    instance_of_C.x(); // Will print Hello from C::x 
    D instance_of_D; 
    instance_of_D.x(); // will print Hello from A::x 
}