![](/img/trans.png)
[英]Design alternative for access to derived class member from base class pointer
[英]Access member of derived class from pointer of base class
我有一個派生自另一個的類,我使用一個基類指針數組來保存派生類的實例,但由於該數組屬於基類,我無法使用指針表示法訪問屬於派生類的成員,我可以通過一個簡單的命令訪問這些成員,或者我應該只重寫我的基類來定義成員並只在派生類中使用它?
例:
class A {
public:
int foo;
};
class B : public A {
public:
char bar;
};
class C : public A {
int tea;
};
int main() {
A * arr[5];
arr[0] = new B;
char test = arr[0]->bar; //visual studio highlights this with an error "class A has no member bar"
return 0;
}
我無法使用指針表示法訪問屬於派生類的成員
這是設計的:您沒有告訴編譯器指針指向的對象是派生類型。
我是否可以通過簡單的命令訪問這些成員
如果你100%確定指針指向B
,你可以執行static_cast<B*>(arr[0])
,但是應該使用強制解決方案作為最后的手段。 相反,您應該在基類中派生成員函數,並在派生類中提供實現:
class A {
public:
int foo;
virtual char get_bar() = 0;
};
class B : public A {
char bar;
public:
char get_bar() {
return bar;
}
};
閱讀關於類型轉換的內容 ,它是該語言的一個非常基本和重要的方面。
簡而言之,您始終可以將指向基類的指針強制轉換為指向派生的指針,然后引用其唯一的公共成員。
A * arr[5];
arr[0] = new B;
char test = static_cast<B*>(arr[0])->bar;
但是,即使A*
實際上沒有指向B
類型的對象,上面的最后一行也是有效的語句。 如果在C
對象上嘗試,它將進行編譯,並在運行時導致未定義的行為。
然而,應該提到的是,通常當一個人無法確定他所提到的對象的類型時,更好的程序設計可能會從一開始就阻止它。 一個普遍的說法是,一般來說,鑄造都是如此。
PS請注意,在你的代碼中, bar
是class B
的私有成員(我無意中假設。默認情況下, class
任何成員都是私有的),因此無論如何都不能在class B
實現之外訪問它。
如果是您的代碼,派生類的成員是私有的。 因此,您無法從基類訪問它。 如果要訪問,則必須將派生類的成員更改為“public”。 您應該像這樣修復您的代碼:
class B : public A {
public:
char bar;
};
int main() {
A * arr[5];
arr[0] = new B;
char test = static_cast <B *>(arr[0])->bar; //visual studio highlights this with an error "class A has no member bar"
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.