[英]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<A*> foo;
附加好處:媒介可以按需增長和收縮。 std::vector<std::shared_ptr<A> > foo;
額外好處:不再擔心delete
。 但是,如果不知道要實現什么目標,就不可能提出正確的方法。
1.您應該避免切片
您應該使用A*
而不是A
這可以幫助您理解原因: 什么是對象切片?
2.您應該將A
類的sayNum()
函數聲明為virtual
函數
A
類A
定義應如下所示:
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。
這類似於分配float
到int
-你失去所有的小數。
您缺少每個類中函數的返回類型。 假設您希望返回類型為void
:
void sayNum() { cout<<num;}
訪問數組元素時,請使用數組對象的下標:
例如:
foo[0]=something;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.