如何解决无继承的公共成员
| 我有一个基类,看起来像这样:class Base
{
public:
typedef std::shared_ptr<Base> ptr_t;
typedef std::weak_ptr<Base> wptr_t;
enum class Type { foo,bar,baz };
Type x;
// ...
};
我希望这些内部类型是公开的,这样我就可以做诸如Base::ptr_t my_ptr(new Base);
之类的事情。但是如果我像这样上新课...
class Derived : public Base
{
// ...
};
不幸的是,“ 3”仍然是基本指针。我想让Derived从Base公开继承x
,但不继承ptr_t
,wptr_t
或Type
。例如
Derived a;
a.x = Base::Type::foo; // this should work
a.x = Derived::Type::foo; // but I want this to fail
这是可能的吗,也许是神奇地使用了friend
或virtual
之类的东西?
解决方法
只需覆盖类型:
class Derived {
typedef int Type;
};
不允许使用Derived::Type
(因为它既是私有的又是typedef
)
, class Derived : public Base
{
// This is now private
using Base::ptr_t;
using Base::wptr_t;
// ...
};
, 根据iammilind和Luc Danton的回答,这是我想出的:
class Base
{
private:
// only \'BaseClass\' is allowed to derive from Base
Base() { }
friend class BaseClass;
public:
typedef std::shared_ptr<Base> ptr_t;
typedef std::weak_ptr<Base> wptr_t;
enum class Type { foo,bar,baz };
Type x;
// ...
};
class BaseClass : public Base
{
private:
// make all the raw_Base types private
using Base::ptr_t;
using Base::wptr_t;
using Base::Type;
};
class Derived : public BaseClass
{
// define as usual,and now all is well in the world.
};
// now,to test it
class Derived2 : public Base { }; // fails
Derived d;
d.x = Derived::Type::foo; // fails
d.x = Base::Type::foo; // works
// Which is exactly what I wanted.
据我所知,此解决方案的唯一问题是它添加了一个新的并可能引起混淆的类。该类的定义方式不能真正被滥用-Base
本身不能由BaseClass
派生而来,但是BaseClass
却是一个没有吸引力的命名空间杂物。
但是,对于我打算在其中使用的特定代码段,我碰巧已经在使用等价的ѭ17来解决一个不相关的问题。因此,这种BaseClass
技术非常适合我的目的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。