簡體   English   中英

C ++類繼承

[英]C++ class inheritance

我在上課時遇到了一些問題。

在代碼中:

class A
{
public:
     int num;
     sayNum() { cout<<num;}
};

class B : public A
{
public:
     sayNum() { cout<<"my num is: "<<num;}
};

/*somewhere else...*/
A foo[10];

B something;
something.num=10;

foo[0]=something;

foo[0].sayNum();
/*...*/

當我調用foo [0] .sayNum();時 它顯示“ 10”,我希望它顯示“我的數字是:10”。 我無法更改數組的類型。 請注意,這只是一個示例代碼,如果我在此處粘貼我的代碼,將很難理解:D)

這行:

foo[0]=something;

復制一些東西到數組中。 因為something的類型(即類B)與foo[0]的類型(即類A)不同,所以需要進行轉換。 在這種情況下, something會被切成薄片 ,只有一部分會存活下來。

最終結果是foo[0]仍然包含類型為class A的對象,因此將永遠不會輸出“ my num is”。

sayNum()更改為虛擬,這是解決您的代碼將顯示的其他問題的好建議,在這種情況下無濟於事。

如何解決它,取決於您要實現的目標。 可能的解決方案是:

  • 更改數組以包含指針A* foo[10]; 注意:這意味着您必須使用'new'和'delete'。
  • 使用std :: vector而不是數組: std::vector<A*> foo; 附加好處:媒介可以按需增長和收縮。
  • 使用智能指針std::vector<std::shared_ptr<A> > foo; 額外好處:不再擔心delete

但是,如果不知道要實現什么目標,就不可能提出正確的方法。

1.您應該避免切片
您應該使用A*而不是A 這可以幫助您理解原因: 什么是對象切片?

2.您應該將A類的sayNum()函數聲明為virtual函數
AA定義應如下所示:

class A
{
public:
    int num;
    virtual void sayNum() { cout << num; }
};

然后,您在somewhere else所說的代碼可能如下所示:

A* foo[10];

B something;
something.num=10;

foo[0] = &something;

foo[0]->sayNum();

在A的定義中將函數sayNum聲明為虛擬的:

virtual void sayNum() { cout<<num;}

編輯:感謝Sjoerd的評論-這仍然對您沒有幫助。 如果要利用多態性,則需要創建一個指向A類的指針數組,而不是一個指向A類的數組。

不,通過為foo[0]分配something ,可以將其轉換為A。

這類似於分配floatint -你失去所有的小數。

  1. 您缺少每個類中函數的返回類型。 假設您希望返回類型為void

    void sayNum() { cout<<num;}

  2. 訪問數組元素時,請使用數組對象的下標:

    例如:

    foo[0]=something;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM