C++ c++;使用基类中的指针访问派生类

C++ c++;使用基类中的指针访问派生类,c++,pointers,derived,C++,Pointers,Derived,编译器一直说“class A”没有名为“foo”的成员。 我试图使用一个带有指针的派生类的函数。这是我的密码: class A{ ..... }; class B:public A{ virtual void foo() = 0; }; class C:public B{ .... public: void foo(){ .... } }; 我有一个名为table的a指针表 Table[j]->foo() 我得到了编译器错误 除了ca

编译器一直说
“class A”没有名为“foo”的成员。
我试图使用一个带有指针的派生类的函数。这是我的密码:

 class A{
  .....
};

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

class C:public B{
....
public:
    void foo(){
        ....
    }
};
我有一个名为
table
a
指针表

Table[j]->foo()
我得到了编译器错误


除了cast,我应该怎么做?

您有一个编译错误,因为函数
foo
没有在类
a
中声明

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

class A {
     virtual void foo() = 0;
};
在派生类中,您不必显式地将
foo
声明为
virtual
。如果只有
C
是一个具体的类,那么您根本不必在类
B
中声明
foo

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

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

您有一个编译错误,因为函数
foo
未在类
a
中声明

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

class A {
     virtual void foo() = 0;
};
在派生类中,您不必显式地将
foo
声明为
virtual
。如果只有
C
是一个具体的类,那么您根本不必在类
B
中声明
foo

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

static_cast<C*>(Table[j])->foo()
static_cast(表[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"
A类
{ ... };
B类:公共A类:{
{
公众:

virtual foo(){std::cout如果您有一个指向基的指针,并且希望访问派生类型的成员,则必须强制转换,以便有一个指向派生类型的指针,或者像您的例子一样,将
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"
A类
{ ... };
B类:公共A类:{
{
公众:

虚拟foo(){std::无法将纯虚函数移动到
A
?这是您实际尝试使用的多态类型。因此,不要在
B
中定义它。它不会有它。是什么让您产生这种想法的?只适用于必须是具体的派生类classes@Jokk-不,它不..将纯虚拟函数移动到
A
?这是您操作的类型通常尝试使用多态性。所以不要在
B
中定义它。它不会有多态性。是什么让你有了这个想法?只适用于必须是具体的派生类classes@Jokk-不,它不…“aaarrrrggghhh”在C风格的演员阵容中。没有理由不使用
静态演员阵容
动态演员阵容
。“aaarrrrggghh”在C风格的演员阵容中。没有理由不在这里使用
静态演员阵容
动态演员阵容