无继承的公共成员

| 我有一个基类,看起来像这样:
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
技术非常适合我的目的。     

要回复问题请先登录注册