私人成员的继承

时间:2015-11-15 21:19:55

标签: c++ inheritance

当被问及B类的私有成员是否由D派生时,一个派生自B的类时,人们强调说:是的,它们是继承的但不能直接访问,只能间接地通过基类中的公共方法访问。好的,但是不被继承和不能直接访问之间的差异是什么?例如,类X(不是从B派生)也可以通过B的公共方法访问B的私有成员,即使X不从B继承任何东西。 有什么区别 1)不被继承和 2)被继承而不是可直接访问。 什么不清楚?

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;
}

如果基类没有任何虚函数,那么继承它的用处就不那么清楚了。事实上,最好不要继承它(至少是公开的),因为缺少虚拟析构函数可能会导致一些问题,而应该把它变成一个成员变量。