簡體   English   中英

C ++訪問派生類與基類的指針

[英]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(){
        ....
    }
};

我有一個名為TableA指針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.

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