gpt4 book ai didi

c++ - 不从基类 C++ 继承

转载 作者:搜寻专家 更新时间:2023-10-31 01:07:37 25 4
gpt4 key购买 nike

让我直截了本地说。这是一个面试问题,我到现在都无法解决。考虑两个类

class A
{
public : virtual int f() { };
int a;
}

class B : public A
{

public : virtual int g() { };
int b;
}

当被问及 A 和 B 的大小时,我正确回答了 8 和 12。下一个问题是如何定义 B 类,以便它忽略从 A 派生的前 8 个字节。他说这是可能的。我仍然不明白这怎么可能。任何人都可以解释如何做到这一点吗?

编辑:真正的问题不是找到类(class)的规模,而是找到跟进。

最佳答案

我不确定提问者期望的答案是什么,但这里有一些可能的解决方案:

将“A”设为指针:

//Only takes 4 or 8 bytes (32 bit vs 64 bit code) for 'A', regardless of 'A's actual size, but must point to an 'A' located elsewhere in memory with the full size.
class B
{
A *a; //Only 4 bytes.
int b;
};

使“A”静态化:

//Doesn't assume any of 'A's size, but all instances of 'B' shares a single instance of 'A'.
class B
{
static A a;

int b;
};

将“A”传递给“B”的函数:

//Pass in the reference to 'a' when needed, so multiple 'B's can share the same 'a' explicitly when desired.
class B
{
void q(A &a) { this->b + a.a; return a.g(); }
};

让'A'和'B'没有虚拟表(可能是面试官的意思)

//By not having virtual functions, you save the (really small) cost of 4 bytes (8 bytes on 64 bit machines)
class A
{
public:
int f() { }; //Not virtual
int a;
}

class B : public A
{
public:
int g() { }; //Not virtual
int b;
}

它仍然花费您 A::a 的大小,并且除非您在 B 中重新使用“a”而不是使用 B::b,否则您无法避免这 4 个字节。重复使用一个变量来表示完全不同的含义可能是一种非常糟糕的编程习惯的迹象。

union A'a 和 B 的变量并将函数放在一个类中

class AB //Only 4 bytes total
{
public:
union
{
int a;
int b;
};

void f();
void g();
};

这个坏主意是,你必须跟踪是否应该访问 'a' 或 'b',因为它们都占用相同的 4 字节内存,并且它们不能同时使用同时。

另一个不好的地方是它表明类(class)有太多的责任。是A还是B?如果两者都是,那么最重要的问题应该是,“为什么两者都是?”。它应该有一个 single-responsibility , 不是 monolith混合用途。

将“A”设为模板,并继承自A<B> :

template<typename TypeB>
class A
{
int a;
};

//Saves the cost of the virtual table... not that that really matters.
class B : public A<B>
{
int b;
};

最后一个称为“curiously recurring template pattern” ' (CRTP)这个想法是继承的'A<B> ' 可以从 'B' 调用访问变量和函数(如果将 B 的 'this' 指针传递给 A 的构造函数),并且 'B' 可以直接从 ' A<B> 访问变量和函数'.

您正在继承为“B”生成的模板“A”的编译时生成版本。

关于c++ - 不从基类 C++ 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19142393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com