程序:
class A
{
int a;
public:
void geta()
{
a=10;
}
void puta()
{
cout<<"a : "<<a;
}
};
class B : public A
{
int b;
public:
void getb()
{
geta(); b=20;
}
void putb()
{
puta(); cout<<"b : "<<b;
}
};
int main()
{
B ABC;
ABC.getb();
ABC.putb();
return 0;
}
问题:上面的程序为派生类对象&调用其相关方法。基类是作为公共成员继承的,由于变量"a"是私有成员,因此它不会被继承。
因此,程序不应该为这个变量分配内存。但是,当执行上述操作时,即使"a"变量不是继承的,它也会被分配。
有人能帮我理解吗?非常感谢。
由于变量"a"是私有成员,因此它不会被继承。因此,程序不应该为这个变量分配内存。
你的假设是错误的。公共继承为"is-a"关系建模。也就是说,类Derived
是一个Base
。使用Base
可以做的任何事情,都应该能够使用Derived
。为了实现这一点,它必须包含Base
包含的所有内容。
在你的例子中,说是完全合法的
B b;
b.put_a();
即在B
对象上使用A
方法。如果a
成员缺席,这将不起作用。
基类是作为公共成员继承的,由于变量"a"是私有成员,因此它不会被继承。
当基类成员被声明为private
时,并不意味着它不会被继承。这只是意味着成员变量将被继承(将是派生类的一部分),但将不可访问。
例如,在:中
class A {
private:
int a;
int b;
// ...
};
class B : public A {};
auto main() -> int {
B b;
}
当我们分配B b;
时,我们同时分配类A
的a
和b
成员对象。
变量a
是继承的,尽管您无法访问它
class A {
private:
int x;
public:
int getXfromA() { return x; }
};
class B : public A {
public:
int getXfromB() { return getXfromA(); }
};
但是,这里不能从B类直接访问x
。
您混淆了存储和访问控制。
如果对象B继承自对象A,则它具有对象A的所有方法和成员,即使它不能直接访问它们。
private
和protected
的目的是访问控制。如果将成员和方法标记为私有,那么外部的任何东西都不能访问这些方法和成员。但是,这些东西仍然是物体的一部分。
这允许您在不公开细节的情况下实现类不变量,包括从基继承的类。
下面是一个示例,它封装了捕获基类中对象的创建时间:
#include <time.h>
#include <iostream>
class Base
{
private:
time_t create_time;
public:
Base()
{
create_time = time(0);
}
time_t get_create_time() { return create_time; }
};
class Derived : public Base
{
public:
Derived() { }
};
int main()
{
Derived D;
std::cout << D.get_create_time() << std::endl;
}
Derived
不知道或者不需要知道创建时间是如何被捕获的。它是从Base
派生而来的类不变量。
这是一个非常简单的例子,但你可以想象更复杂的例子。