在 C++ 中覆盖函数时如何选择基数 class?
How do I choose the base class when overriding a function in c++?
我有两个基础 classes 和一个继承两个基础 classes 的 class。
两个基础 classes 都有一个具有相同签名的虚函数,我想在派生的 class 中为每个虚函数提供不同的实现。
class A{
virtual void f() = 0;
}
class B{
virtual void f() = 0;
}
class Derived:public A, public B{
void A::f() override{ // Error
...
}
void B::f() override{ // Error
...
}
}
正确的做法是什么? (我无法重命名虚函数。实际上这两个基数 class 是从同一个模板 class 生成的。)
template <typename T>
class AShim : public A {
void f() override {
static_cast<T*>(this)->A_f();
}
};
template <typename T>
class BShim : public B {
void f() override {
static_cast<T*>(this)->B_f();
}
};
class Derived: public AShim<Derived>, public BShim<Derived> {
void A_f();
void B_f();
};
class A {
public:
virtual void f() = 0;
};
class B {
public:
virtual void f() = 0;
};
class Derived :public A, public B {
public:
void A::f() {
cout << "Inside A's version"<<endl;
}
void B::f() {
cout << "Inside B's version"<<endl;
}
};
int main()
{
Derived derived;
cout << "calling A" << endl;
A *a;
a = &derived;
a->f();
cout << "calling B" << endl;
B *b;
b = &derived;
b->f();
}
对我来说很好用。无需明确提及 override 关键字,因为在定义函数 时,纯虚函数将凭借其默认 properties.Use 基础 class 的作用域被覆盖 [=15] =].使用 public 访问说明符启用派生的 classes 来覆盖纯虚函数。就这些了。
我有两个基础 classes 和一个继承两个基础 classes 的 class。 两个基础 classes 都有一个具有相同签名的虚函数,我想在派生的 class 中为每个虚函数提供不同的实现。
class A{
virtual void f() = 0;
}
class B{
virtual void f() = 0;
}
class Derived:public A, public B{
void A::f() override{ // Error
...
}
void B::f() override{ // Error
...
}
}
正确的做法是什么? (我无法重命名虚函数。实际上这两个基数 class 是从同一个模板 class 生成的。)
template <typename T>
class AShim : public A {
void f() override {
static_cast<T*>(this)->A_f();
}
};
template <typename T>
class BShim : public B {
void f() override {
static_cast<T*>(this)->B_f();
}
};
class Derived: public AShim<Derived>, public BShim<Derived> {
void A_f();
void B_f();
};
class A {
public:
virtual void f() = 0;
};
class B {
public:
virtual void f() = 0;
};
class Derived :public A, public B {
public:
void A::f() {
cout << "Inside A's version"<<endl;
}
void B::f() {
cout << "Inside B's version"<<endl;
}
};
int main()
{
Derived derived;
cout << "calling A" << endl;
A *a;
a = &derived;
a->f();
cout << "calling B" << endl;
B *b;
b = &derived;
b->f();
}
对我来说很好用。无需明确提及 override 关键字,因为在定义函数 时,纯虚函数将凭借其默认 properties.Use 基础 class 的作用域被覆盖 [=15] =].使用 public 访问说明符启用派生的 classes 来覆盖纯虚函数。就这些了。