gpt4 book ai didi

c++ - 从 Base 引用对象调用派生类的成员

转载 作者:太空宇宙 更新时间:2023-11-04 15:55:16 25 4
gpt4 key购买 nike

我在 SO 上发现了许多类似的问题,但他们的解决方案要么不起作用,要么略有不同(通常使用指针代替,我不想更改 caller() 签名!)。如果已经有人问过(并回答过),请告诉我,我会删除这个问题。

我发现了一种名为访问者模式 的东西,但我很好奇是否有更简单的解决方案。我尝试在不使用 virtual 的情况下执行此操作,因为我的类(class)尚未涵盖该内容。或者我需要它吗?

我有以下代码:

class Base
{
public:
void fun(); // cout << "Base"
};

class Derived : public Base
{
public:
void fun(); // cout << "Derived"
};

void caller(Base &obj) // must stay as it is
{
// here i want to call Derived::fun()
// obj.fun() prints 'Base' but I need 'Derived'
}

int main()
{
// Base base;
// caller(base);

// EDIT:
Derived derived;
caller(derived);

}

当将 Base & 传递给函数 caller() 时,让 caller() 调用 Derived::fun() 而不是 Base::fun() 的最简单方法是什么?

如果有一个简单的答案指向正确的方向,我将不胜感激,我已经坚持了一段时间了:)

我知道这不是您在生产代码中要做的事情,这是关于学习 C++

编辑:我将调用函数参数更改为类型 Derived 而不是 Base

最佳答案

不可能在 Base 类对象上调用 Derived 成员函数。

每个 Derived 都是一个 Base,但是 Base 不是 Derived。换句话说,Derived 可能包含 Base 所缺少的一大堆信息。 您可以在Derived 类对象上调用Base 成员函数,但不能以其他方式调用

换句话说...

class Base {
public: void b_thing() { }
};

class Derived : public Base {
public: void d_thing() { }
};

int main() {
Base b;
Derived d;

d.b_thing(); // Okay!
b.d_thing(); // Bad :(
}

但是,您可以有一个引用 Derived 对象的 Base 引用:

Base &b_ref = d;

因为这实际上是一个 Derived 对象,您可以让它调用 Derived 成员函数(在 中声明为 virtual Base) 通过多态性:

class Base {
public: virtual int thing() { return 0; }
};

class Derived : public Base {
public: int thing() { return 1; }
};

int caller(Base &obj)
{
return obj.thing(); // Returns 1 if obj actually references a Derived object
}

int main() {
Base b;
Derived d;

caller(d); // 1
caller(b); // 0
}

但是,请注意,当传递一个 Base 对象时(当 obj 实际上引用一个 Base 对象时),我们仍然调用 Base 成员函数。

关于c++ - 从 Base 引用对象调用派生类的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59271031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com