当被问及B类的私有成员是否由D派生时,一个派生自B的类时,人们强调说:是的,它们是继承的但不能直接访问,只能间接地通过基类中的公共方法访问。好的,但是不被继承和不能直接访问之间的差异是什么?例如,类X(不是从B派生)也可以通过B的公共方法访问B的私有成员,即使X不从B继承任何东西。 有什么区别 1)不被继承和 2)被继承而不是可直接访问。 什么不清楚?
答案 0 :(得分:2)
不同之处在于班级布局。
struct B {
private: char buf[1024];
};
struct D : B { };
此处,sizeof(D)
> = sizeof(B)
。它仍然那里,即它显然是继承的。
答案 1 :(得分:1)
如果基类具有可以被派生类覆盖的虚函数,显然这对于有权访问基类实例但不从其继承的类来说是一个重要的区别:
#include <stdio.h>
int main(int argc, char **argv) {
long long int counts[256] = { 0 };
int c;
FILE *f;
if (argc < 2) {
fprintf(stderr, "usage: %s FILE\n", argv[0]);
exit(2);
}
if ((f = fopen(argv[1], "r")) == NULL) {
fprintf(stderr, "%s: cannot open %s\n", argv[0], argv[1]);
exit(1);
}
while ((c = getc(f)) != EOF) {
counts[c & 255]++;
}
fclose(f);
printf("Number of A's: %lld", counts['a'] + counts['A']);
return 0;
}
如果基类没有任何虚函数,那么继承它的用处就不那么清楚了。事实上,最好不要继承它(至少是公开的),因为缺少虚拟析构函数可能会导致一些问题,而应该把它变成一个成员变量。