如何省略类继承

How can I omit a class inheritance?

本文关键字:继承 何省略      更新时间:2023-10-16

我正试着四处寻找。我有两个类,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

在您提出的问题中,您声称需要AB中的一个方法,该方法不是多态的,但在具有相同签名的两个类(通过继承链接的(中表现出不同的行为

此外,该方法遵循ADL发现的自由函数(好!(。

所以。。。我想问你的是。如果您已经有一个名为f(A|B)的免费函数的保证,为什么不简单地将其作为接口进行文档化呢?

如果你坚持要有thisf(),你会给自己带来问题,因为继承关系会导致Bthisf()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;
}