2015-10-06 50 views
-2

我有一個繼承到派生類中的基類。然後我實例化基礎對象和派生對象。訪問派生對象中的繼承類

class Base 
    { public : 
      Base() {} 
     ~Base) {} }; 

class Derived : public Base 
    { public : 
      Derived() {} 
     ~Derived() {} }; 

Base b; 
Derived d; 
Derived::Base::d = b; 

現在我想將基類對象(b)複製到派生類對象(d)中,代替它的繼承基類。關於語法的任何想法?

+0

任何接受與一個基地接受派生,如果基地是可複製的'基地b = d;'應該管用。 –

+0

你究竟在做什麼? http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem –

+0

*「語法上的任何想法?」* - 這不是一個具體問題的問題。 Stackoverflow是關於具體解決方案的具體問題。 –

回答

1

我想你想說的是,你想初始化Derived的數據成員給一些Base的成員。

您可以使用Base中的拷貝構造函數和Derived中的相應構造函數來傳遞值。

Code

class Base 
{ 
    public : 
     Base() { /*...*/} 
     Base(const Base& other){/*...*/} 
     virtual ~Base() {/*...*/} 
    private: 
     /*...*/ 
}; 

class Derived : public Base 
{ 
    public : 
     Derived() {/*...*/} 
     ~Derived() {/*...*/} 
     Derived(const Base& other) : Base(other){/*...*/} 

}; 

int main() 
{ 
    Base b; 
    Derived d(b); 
} 

您可以轉發構造函數和賦值操作符做類似的操作。

+0

做好基礎類析構函數是很重要的! – user3282085

+0

@ user3282085:僅當這些類將以多態方式使用時。如果沒有,那麼添加虛擬析構函數是浪費。 –

0
Derived::Base::d = b; 

的語法任何想法?

這是錯誤的。對於工作語法選項將包括:

  • static_cast<Base&>(d) = b;
  • d.Base::operator=(b1);

兩者都是很醜陋;這是由於子類中的賦值運算符隱藏了基本版本。就像在C++中經常出現的那樣,語法的醜陋性表明這種操作是不尋常的,重構可能是一個好主意。


一般來說,運算符重載和繼承不拌勻,特別是如果你正在使用面向對象的編程繼承(即虛擬函數)。在這種情況下,通常會確保該類根本不可分配(因爲您只需在基類中生成分配運算符delete,所以C++ 11變得非常簡單)。

你也應該多看一些關於對象切片,例如所有的答案和註釋,這兩個問題: