int*_*nt3 4 c++ inheritance class
我想这样做:
class Derived;
class Base {
virtual Derived f() = 0;
};
class Derived : public Base {
};
Run Code Online (Sandbox Code Playgroud)
当然这不起作用,因为我不能返回不完整的类型.但是我也不能在base之前定义Derived,因为我也不能从不完整的类型继承.我认为我可以使用模板作为解决方法(使用Derived作为Base的模板参数),但这似乎是一种非常丑陋的做事方式.可能还有另一种方式吗?
详细说明:我正在编写一个光线跟踪器,每个Shape类都有一个返回其边界框的函数.但是,我已经让BBox成为Shape的子类,所以我可以想象它.这是不好的设计吗?
您的问题中的代码没有任何问题.这个
class Derived;
class Base {
virtual Derived f() = 0;
};
class Derived : public Base {
virtual Derived f() {return Derived();}
};
Run Code Online (Sandbox Code Playgroud)
应该编译得很好.但是,'Base :: f()'的调用者需要看到'Derived` 的定义.
您可以使用指针(或引用):
class Derived;
class Base {
virtual Derived *f() = 0;
};
class Derived : public Base {
};
Run Code Online (Sandbox Code Playgroud)
但这对我来说是代码味道.为什么从这个类继承的人需要知道另一个派生类?事实上,基类为什么要关注它的衍生物呢?
根据您的情况,您需要注意那些不好的设计信号.虽然你的边界框是有意义的,但请Shape记住,因为Shape有一个函数返回一个边界框,一个边界框将有一个返回自身的函数.
我不确定最好的解决方案,但你可以BBox完全单独创建一个类,也许给它一个类似于:的函数Shape *as_shape(void) const,它将构造一个class Box : public Shape与边界框尺寸相同的函数.
我仍然觉得有更好的方法,但我现在没时间了,我相信别人会想到更好的解决方案.
你对模板的看法不一定是坏的。您所描述的称为Curiously Recurring Template Pattern。
一个例子:
#include <iostream>
template <typename T>
struct Base
{
virtual T* foo() = 0;
};
struct Derived : Base<Derived>
{
virtual Derived* foo() { return this; }
};
Run Code Online (Sandbox Code Playgroud)