如何省略类继承
How can I omit a class inheritance?
我正试着四处寻找。我有两个类,A和B,其中B继承自A。
A和B还有两个重载函数,它们以两种不同的方式作用于它们。
现在从类函数中调用这些函数,如下所示:
#include <iostream>
struct A;
struct B;
void f(A a);
void f(B b);
struct A {
int i;
A(): i(0) {};
void thisf() { f(*this); }
};
struct B: public A {
int j;
B(): j(1) {};
void thisf() { f(*this); }
};
void f(A a) { std::cout << a.i << std::endl; }
void f(B b) { std::cout << b.i << " " << b.j << std::endl; }
int main() {
A a;
B b;
a.thisf();
b.thisf();
return 0;
}
我的问题是:由于A::thisf((和B::thisf((是相同的(并且对于更多的子类将保持相同(,有没有一种方法可以省略B::this((,同时仍然具有相同的功能
预期输出应该看起来像:
0
0 1
我尝试这样做的更多细节是:我想为不同类型的数据提供一些自定义渲染功能,而不会用渲染逻辑使类膨胀,并拥有一个带有一些状态变量的单独渲染类。但我不想放弃写的可能性
b.render()
在某些情况下。在我的课堂定义中,我想尽我所能留出每一行。
我在这个帖子中得到了这个想法:https://gamedev.stackexchange.com/questions/63912/visitor-pattern-vs-inheritance-for-rendering
在您提出的问题中,您声称需要A
和B
中的一个方法,该方法不是多态的,但在具有相同签名的两个类(通过继承链接的(中表现出不同的行为。
此外,该方法遵循ADL发现的自由函数(好!(。
所以。。。我想问你的是。如果您已经有一个名为f(A|B)
的免费函数的保证,为什么不简单地将其作为接口进行文档化呢?
如果你坚持要有thisf()
,你会给自己带来问题,因为继承关系会导致B
的thisf()
与A
的不明确。这可以通过多态性来解决(根据另一个答案(,但由于您拒绝了这一点,除了完全消除逻辑冗余的thisf()
之外,您几乎没有其他选择。
在任何情况下,此代码都将完全按照您的意愿执行:
#include <iostream>
struct A;
struct B;
void f(A a);
void f(B b);
struct common_interface {
virtual void thisf() = 0;
};
template<class Host, class Base>
struct common_interface_impl : Base {
virtual void thisf() {
f(static_cast<Host&>(*this));
}
};
struct A : common_interface_impl<A, common_interface>
{
int i;
A(): i(0) {};
};
struct B: common_interface_impl <B, A>
{
int j;
B(): j(1) {};
};
void f(A a) { std::cout << a.i << std::endl; }
void f(B b) { std::cout << b.i << " " << b.j << std::endl; }
int main() {
A a;
B b;
a.thisf();
b.thisf();
return 0;
}
#include <iostream>
struct A {
int i;
A(): i(0) {};
virtual ~A() {};
virtual void thisf() { std::cout << i << std::endl; }
};
struct B: public A {
int j;
B(): j(1) {};
void thisf() { A::thisf(); std::cout << j << std::endl; }
};
void f( A* a )
{
a->thisf();
}
int main() {
A* a = new A();
A* b = new B();
f( a ); f( b );
delete a; delete b;
return 0;
}
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- Python中的for循环与C++有何不同
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 如何省略类继承