c++中指向对象及其后代的指针

pointers to object and descendants in C++

本文关键字:后代 指针 对象 c++      更新时间:2023-10-16

我正在做一个简单的c++(在Linux下)项目,它将有指向对象的指针。我有类A,类B扩展了A,类C扩展了B。类C有一个方法(test),在A和B中都不存在。

是否可能有一个单一的指针'p',可以指向a, B和C类型的对象?我怎么定义那个指针呢?

其次,由于a.test()不存在,但c.test()存在,我的泛型指针'p'可以调用p->test()吗?这能编译吗?如果在运行时p指向类A的对象并且我调用p->test()怎么办?这是运行时错误吗?

可以有一个指针指向的对象A、B和C类型?

我想你的意思是"可以指向A对象或B对象或C对象",对吗?

是的,你可以有这样一个指针。

如何定义指针?

A*

基类指针可以指向派生类的对象。

其次,如果指针可以调用对象的方法,我该如何调用呢指向A/B/C类?

A中定义virtual函数,并在BC中覆盖它。然后,当你通过A*调用方法时,语言将执行动态调度,即它将根据你的A*指向AB还是C自动调用正确的方法。

我需要在调用方法之前强制转换它们吗?

。这将大大违背虚函数的目的。

下面是一个完整的例子:

#include <iostream>
class A
{
public:
    virtual ~A() {} // not really needed in this program,
                    // but almost always needed in real code
                    // when a class has a virtual function
    virtual void method() { std::cout << "A::methodn"; }
};
class B : public A
{
public:
    virtual void method() override { std::cout << "B::methodn"; }
};
class C : public A
{
public:
    virtual void method() override { std::cout << "C::methodn"; }
};
int main()
{
    A a;
    B b;
    C c;
    A* ptr = &a;
    ptr->method();
    ptr = &b;
    ptr->method();
    ptr = &c;
    ptr->method();
}
输出:

A::method
B::method
C::method