0

我正在开发一个简单的 C++(在 Linux 下)项目,该项目将具有指向对象的指针。我有 A 类、扩展 A 的 B 类和扩展 B 的 C 类。C 类有一个在 A 或 B 中不存在的方法(测试)。

是否有可能有一个指针“p”可以指向 A、B 和 C 类型的对象?我将如何定义该指针?

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

4

1 回答 1

4

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

我假设您的意思是“可以指向 A 对象或 B 对象或 C 对象”,对吗?

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

我将如何定义该指针?

A*

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

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

您在和中定义一个virtual函数A并覆盖它。然后,当您通过 your 调用方法时,语言将执行动态调度,即它会根据您指向 a 、指向 a还是指向 a自动调用正确的方法。BCA*A*ABC

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

不,这几乎会破坏虚函数的目的。

这是一个完整的例子:

#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::method\n"; }
};

class B : public A
{
public:
    virtual void method() override { std::cout << "B::method\n"; }
};

class C : public A
{
public:
    virtual void method() override { std::cout << "C::method\n"; }
};

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
于 2015-09-20T14:39:41.253 回答