[英]c++ access derived class with a pointer from base class
編譯器一直說'class A' has no member named 'foo'.
我試圖使用帶有指針的派生類中的函數。 這是我的代碼:
class A{
.....
};
class B:public A{
virtual void foo() = 0;
};
class C:public B{
....
public:
void foo(){
....
}
};
我有一個名為Table
的A
指針Table
,當嘗試
Table[j]->foo()
我收到編譯器錯誤。
除了演員外,我該怎么辦?
您遇到編譯錯誤,因為在類A
未聲明函數foo
。
您可以這樣在A
中將其聲明為純虛擬的:
class A {
virtual void foo() = 0;
};
在派生類中,不必將foo
聲明為顯式virtual
。 如果只有C
是具體的類,則根本不需要在B
類中聲明foo
。
如果您的示例知道在指向A
的指針數組中只有類C的實例,則可以顯式轉換為指向C
指針,但這是設計不良的標志,我不建議這樣做:
static_cast<C*>(Table[j])->foo()
如果您有一個指向基礎的指針,並且想要訪問派生類型的成員,則必須進行強制轉換,以便您有一個指向派生類型的指針,或者將foo()
作為實例中的虛成員添加到派生類型。
class A
{ ... };
class B : public A:{
{
public:
virtual foo() { std::cout << "B::foo" << std::endl; }
};
class C : public B
{
public:
void foo() { std::cout << "C::foo" << std::endl;
};
...
A * arr[8];
for(int i = 0; 8>i; ++i)
arr[i] = new C;
((B*)arr[0])->foo(); // will print "C::foo\n"
但是,如果您添加了virtual void foo() = 0;
到A
那么您只需要執行arr[0]->foo()
,它仍然會打印C::foo
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.