好的,这更像是要求澄清 C++ 的功能是如何工作的,而不是回答是否可以。我将首先解释我遇到的问题,因为直接的答案是它不是一个很好的类设计。
我有一个类正在形成一个不可维护的 if 语句块;当我尝试将其转换为复合对象时,我开始对如何让深层副本工作而不是原始 blob 以及一般的小对象分配问题感到更加困惑。因此,我开始寻找一种方法将 blob 拆分为几个类,编译器可以将它们转换回原始 blob。
在下面的代码中,我知道super::get_x()
infoo_b
并且foo_c
是可内联的——来自其他堆栈溢出问题——但我不确定super::get_z()
infoo_c
是否是。最后对f.get_x()
,f.get_y()
和的f.get_z()
调用是否会是虚函数调用,因为它不是显式的,并且它不知道是否foo
有子类,或者它们是否是可内联的,因为它实际上没有?
namespace PRIVATE {
class foo_a
{
int x, y, z;
public:
foo_a(int X, int Y, int Z)
{
x = X; y = Y; z = Z;
}
virtual ~foo_a() { }
virtual void update() { };
virtual int get_x() const { return x; }
virtual int get_y() const { return y; }
virtual int get_z() const { return z; }
};
class foo_b : public virtual foo_a
{
typedef foo_a super;
unsigned char c_0,c_1,c_2, mod;
public:
foo_b(int X, int Y, int Z) : foo_a(X, Y, Z)
{
c_0 = c_1 = c_2 = mod = 0;
}
virtual ~foo_b() { }
void activate_b()
{
c_2 = c_1;
c_1 = c_0;
c_0 = 5;
mod = c_0? 1 + (c_1? 1 + (c_2? 1 : 0) : 0) : 0;
}
virtual void update()
{
super::update();
if(c_0) { --c_0; mod = 1;
if(c_1) { --c_1; mod = 2;
if(c_2) { --c_2; mod = 3; }}};
}
virtual int get_x() const { return super::get_x() + mod; };
virtual int get_y() const { return super::get_y() - mod; };
};
class foo_c : public virtual foo_b
{
typedef foo_b super;
bool active;
public:
foo_c(int X, int Y, int Z) : foo_b(X, Y, Z)
{
active = false;
}
virtual ~foo_c() { }
bool activate_c(bool X) { return (active = X); }
virtual int get_x() const
{
int t = super::get_x();
return active? t % 8 : t;
}
virtual int get_z() const
{
int t = super::get_z();
return active? t % 8 : t;
}
};
}
class foo : public virtual PRIVATE::foo_c
{
public:
foo(int X, int Y, int Z) : PRIVATE::foo_c(X, Y, Z) { }
virtual ~foo() { }
};
int main(int argc, const char * argv[])
{
foo * f = new foo(4, 6, 8);
f->activate_b();
f->get_x();
f->get_y();
f->get_z();
delete f;
return 0;
}