C++ 可以消除这个基类构造函数吗?
有没有办法消除Foo中的显式构造函数调用,并将Bar::len分配给任何Bar子类的大小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
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。哦。