用并行基础 class 方法覆盖纯虚方法?
Override pure virtual method with parallel base class method?
说我有 class Foo
一个纯虚函数 say
和 class Bar
一个方法 say
我想要实现继承自 Foo
和 Bar
的 class FooBar
,Foo::say
被 Bar::say
覆盖。我可以做如下事情:
#include <iostream>
class Foo {
public:
virtual void say() = 0;
};
class Bar {
public:
void say() {
std::cout <<"I am a Bar." << std::endl;
}
};
class FooBar : public Foo, public Bar {
public:
void say() override {
Bar::say();
}
};
int main() {
FooBar foobar;
foobar.say(); // I want to print "I am a Bar."
return 0;
}
但这只会使 FooBar::say
成为调用 Bar::say
的函数。这是一个非常小的烦恼,但有没有办法让 FooBar
直接用 Bar::say
覆盖 Foo::say
?让 FooBar::say
inline
能可靠地完成这个吗?我意识到我可以让 Bar
继承自 Foo
并且 FooBar
仅继承自 Bar
但这在实际项目中是不合适的,这个例子类似于.
#include <iostream>
class ISay {
public:
virtual void say() = 0;
};
class Bar: public virtual ISay {
public:
void say() override {
std::cout <<"I am a Bar." << std::endl;
}
};
class FooBar : public virtual ISay, public Bar {};
int main() {
FooBar foobar;
foobar.say(); // Prints "I am a Bar."
}
这在虚拟继承中被称为支配。
有些人认为,为了支持这一点,应该始终虚拟地继承接口。
虚拟继承有两个主要成本(可能更多):
- 初始化虚拟继承的common class sub-object,最上面的base class,在most derived class中指定。 class 继承链中间的规范将被忽略。
- 成员函数调用可能会有一些开销,因为可能需要调整
this
指针。
说我有 class Foo
一个纯虚函数 say
和 class Bar
一个方法 say
我想要实现继承自 Foo
和 Bar
的 class FooBar
,Foo::say
被 Bar::say
覆盖。我可以做如下事情:
#include <iostream>
class Foo {
public:
virtual void say() = 0;
};
class Bar {
public:
void say() {
std::cout <<"I am a Bar." << std::endl;
}
};
class FooBar : public Foo, public Bar {
public:
void say() override {
Bar::say();
}
};
int main() {
FooBar foobar;
foobar.say(); // I want to print "I am a Bar."
return 0;
}
但这只会使 FooBar::say
成为调用 Bar::say
的函数。这是一个非常小的烦恼,但有没有办法让 FooBar
直接用 Bar::say
覆盖 Foo::say
?让 FooBar::say
inline
能可靠地完成这个吗?我意识到我可以让 Bar
继承自 Foo
并且 FooBar
仅继承自 Bar
但这在实际项目中是不合适的,这个例子类似于.
#include <iostream>
class ISay {
public:
virtual void say() = 0;
};
class Bar: public virtual ISay {
public:
void say() override {
std::cout <<"I am a Bar." << std::endl;
}
};
class FooBar : public virtual ISay, public Bar {};
int main() {
FooBar foobar;
foobar.say(); // Prints "I am a Bar."
}
这在虚拟继承中被称为支配。
有些人认为,为了支持这一点,应该始终虚拟地继承接口。
虚拟继承有两个主要成本(可能更多):
- 初始化虚拟继承的common class sub-object,最上面的base class,在most derived class中指定。 class 继承链中间的规范将被忽略。
- 成员函数调用可能会有一些开销,因为可能需要调整
this
指针。