c ++使用来自基类的指针访问派生类

问题描述 投票:0回答:2

编译器一直在说'class A' has no member named 'foo'.我试图使用带指针的派生类中的函数。这是我的代码:

 class A{
  .....
};

class B:public A{
     virtual void foo() = 0;
};

class C:public B{
....
public:
    void foo(){
        ....
    }
};

我有一张名为ATable指针表和尝试时

Table[j]->foo()

我收到编译器错误。

除了演员外我该怎么办?

c++ pointers derived
2个回答
2
投票

您有编译错误,因为函数foo未在类A中声明。

您可以在A中将其声明为纯虚拟,如下所示:

class A {
     virtual void foo() = 0;
};

在派生类中,您不必将foo声明为明确的virtual。如果只有C是一个具体的类,你根本不必在类foo中声明B

如果您的示例如果您知道在A指针数组中只有C类实例,则可以显式转换为指向C的指针,但这是设计不佳的标志,我不推荐它:

static_cast<C*>(Table[j])->foo()

0
投票

如果你有一个指向基类的指针并且想要访问派生类型的成员你必须进行转换,那么你有一个指向派生类型的指针,无论是在你的情况下,还是在你的情况下将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

© www.soinside.com 2019 - 2024. All rights reserved.