gpt4 book ai didi

c++ - 如何在基类中获取派生类的子类型

转载 作者:太空狗 更新时间:2023-10-29 20:41:13 30 4
gpt4 key购买 nike

考虑下面的例子

template <typename T>
class A
{
typename T::x a; //not used
virtual typename T::x* function()=0;
};

class B:public A<B>
{
public:
typedef XXX x;
x obj;
x* function()
{
return &obj;
}

};

这里我想在 A 类中使用 B::x 类型。

有什么办法吗?

最佳答案

这行不通。为了实例化A ,编译器至少需要有一个前向声明 x .但是您不能转发声明类型的成员,因为这是该类型的实现细节,并且暗示您已经了解该类的某些部分。

但是,您可以尝试将返回类型直接传递给 A并将其用作返回类型:

template <typename T>
class A
{
public:
typedef T ret_type;
virtual ret_type* function() = 0;
};

class B : public A<int>
{
public:
A::ret_type obj;
virtual A::ret_type* function() override
{
return &obj;
}
};

使用这种方法你可以这样做:

class X : public A<int> { ... };
class Y : public A<int> { ... };

A<int>* p1 = new X();
A<int>* p2 = new Y();
p1->function();
p2->function();

...使基类更有用。

parent 不需要知道 child 的任何事情,否则继承就变得毫无意义。在你的情况下 A可以被认为是一个接口(interface),任何实现接口(interface) A<int> 的类都是有意义的将表现相同。相反,如果您将子类传递给 A ,每个接口(interface)实现都是不同且唯一的,即使它可能具有完全相同的返回类型。如果你真的需要这个,考虑制作 A一个实用程序类并将其作为成员嵌入到子类中(“有利于组合而不是继承”)。

关于c++ - 如何在基类中获取派生类的子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22175113/

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