C++ 可以消除这个基类构造函数吗?

C++ 可以消除这个基类构造函数吗?,c++,class,templates,subclass,C++,Class,Templates,Subclass,有没有办法消除Foo中的显式构造函数调用,并将Bar::len分配给任何Bar子类的大小 class Bar { size_t len_; Bar(size_t len) : len_(len) { } }; class Foo : public Bar { Foo() : Bar(sizeof(Foo)) { } }; 您可以使用“奇怪的递归模板”通知基类派生类的类型: template <typename Derived> class Bar

有没有办法消除Foo中的显式构造函数调用,并将Bar::len分配给任何Bar子类的大小

class Bar
{
    size_t len_;

    Bar(size_t len) : len_(len) { }
};

class Foo : public Bar
{    
    Foo() : Bar(sizeof(Foo)) { }
};
您可以使用“奇怪的递归模板”通知基类派生类的类型:

template <typename Derived>
class Bar
{
    size_t len_;
protected:
    Bar() : len_(sizeof(Derived)) {}
};

class Foo : public Bar<Foo>
{
};
模板
分类栏
{
尺寸、长度;
受保护的:
Bar():len_z(sizeof(派生)){
};
Foo类:公共酒吧
{
};

虚拟继承可能会执行您想要的操作:

#include <iostream>

class Bar
{
    size_t len_;
public:
    Bar(size_t len) : len_(len) {std::cout << len << '\n';}
};

class Foo : virtual public Bar //virtual inheritance
{    
    size_t foo_bigger_than_bar;
public:
    Foo() : Bar(sizeof(Foo)) { } //Bar only called if Foo is most derived
};

class Derived2: public Foo
{    
    size_t derived2_bigger_than_foo;
public:
    Derived2() : Bar(sizeof(Derived2)), Foo() { }
    // since Foo virtually derives from Bar, we have (get) to 
    // initialize Bar ourselves.
};

int main() {
    Foo f;
    std::cout << '\n';
    Derived2 d;
}
#包括
分类栏
{
尺寸、长度;
公众:

Bar(size\t len):len(len){std::cout哦,我明白了。显式构造函数可能是一个误导性的术语,因为像
显式Bar(size\t len)
之类的东西。我不知道。Bar子类无法知道其最派生类型的大小。返回
sizeof(*this)的虚拟成员
len()
如何
,在每个派生类中都被重写?@KerrekSB:虚函数在构造函数/析构函数中难道不起作用吗?@MooingDuck:好吧,在那个版本中根本没有理由使用构造函数……这有点违背继承的目的,因为你不能在不知道派生类型的情况下进行向下转换。@Dani:方法是n完全可以应用:
类base{int len;base(int l):len(l){};模板类base\t:base{base\t():base(sizeof(t)){}
然后从
base\t
模板派生所有类,而不是
base
。没有任何东西是通过额外的间接层次无法实现的:)@Dani:你能详细说明一下吗?我真的不明白向下转换与我的答案或“继承的目的”有什么关系。从技术上讲,这个问题并不是说“直接子类”所以我认为这对孙辈不起作用。但它对一级继承很好。事实上@MikeSeymour的答案完全符合要求——至少对我的特殊需求是这样的!哦,我以为问题是大小合适,没意识到这是在删除初始值设定项altogeather。哦。