假设一个类有私有数据成员,但是setter和getter在公共范围内。如果从此类继承,您仍然可以调用这些setter和getter - 允许访问基类中的私有数据成员。这怎么可能,因为提到派生类不能继承私有数据成员
答案 0 :(得分:27)
派生类不会将访问继承到私有数据成员。但是,它确实继承了一个完整的父对象,该对象包含该类声明的任何私有成员。
答案 1 :(得分:8)
这取决于继承类型。如果您私下继承,则派生类无权访问Base的私有成员。
Access public protected private
-----------------------------------------------------------
members of the same class yes yes yes
members of derived classes yes yes no
not members yes no no
答案 2 :(得分:4)
因为getter和setter是public
- 所以任何人都可以调用它们,而不仅仅是派生类。
答案 3 :(得分:2)
您可以通过设置对setter和getter的访问权限来访问它们,并像这样访问它们
*.h
class Mamifere
{
private:
int a;
public:
Mamifere();
virtual ~Mamifere();
int getA();
// ~Mamifere(); //le delete dans le exp02() affiche seulement mamifere mort :( destructeur de la class mere
void manger() ;
virtual void avancer() const;
};
class Deufin:public Mamifere{
public:
Deufin();
void manger() const;
void avancer() const;
~Deufin();
};
*.cpp
Mamifere::Mamifere(){
printf("nouveau mamifere est nee\n");
this->a=6;
}
Mamifere::~Mamifere(){
printf("mamifere Mort :(\n");
}
void Mamifere::manger() {
printf("hhhh je mange maifere %d\n",Mamifere::getA());
}
void Mamifere::avancer() const{
printf("allez-y Mamifere\n");
}
Deufin::Deufin(){
printf("nouveau Deufin est nee\n");
}
int Mamifere::getA(){
return this->a;
}
void Deufin::manger() const{
printf("hhhh je mange poisson\n");
}
void Deufin::avancer() const{
printf("allez-y Deufin\n");
}
Deufin::~Deufin(){
printf("Deufin Mort :(\n");
}
main.cpp
void exp031(){
Mamifere f;//nouveau mamifere est nee // nouveau Deufin est nee
Deufin d;
f.avancer();//allez-y Deufin (resolution dynamique des lien la presence de mot cle virtual)
f.manger();//hhhh je mange maifere (resolution static des lien pas de mot cle virtual)
printf("a=%d\n",d.getA());//Deufin Mort :( mamifere Mort :( (resolution static des lien la presence de mot cle virtual) distructeur de class fille appel auromatiquement le destructeur de la class mere
}
int main(){
exp031();
getchar();
return 0;
}
答案 4 :(得分:0)
Getters和setter不会让您完全控制私有数据成员。控件仍然在于基类。
答案 5 :(得分:0)
使用模式
class MyClass {
private: int a;
public: void setA(int x) { a = x; }
public: int getA() const { return a; }
};
似乎是面向对象的,并且已经发送了封装。
然而正如您所注意到的那样,您仍然可以直接访问私有字段,而且只需将a
公开并直接访问即可获得。
使用这样的getter和setter在C ++中没有任何意义。
答案 6 :(得分:0)
它们是包含的,但不是继承的。这意味着什么:
public static void SplitFil(int rows, string inputFile) {
int outFileNumber = 1;
const int MAX_LINES = 50000;
string header = "";
if (GetFileSize(inputFile) > MAX_LINES) {
var reader = File.OpenText(inputFile);
while (!reader.EndOfStream)
{
var start_idx = 0;
var writer = File.CreateText($"filename_{outFileNumber}.csv");
if (outFileNumber > 1) {
writer.WriteLine(header);
start_idx = 1;
}
for (int idx = start_idx; idx < MAX_LINES; idx++)
{
var row = reader.ReadLine();
if (idx == 0 && outFileNumber == 1) header = row;
writer.WriteLine(row);
if (reader.EndOfStream) break;
}
writer.Close();
outFileNumber++;
}
reader.Close();
}
}
,: public SomeClass
甚至是: protected SomeClass
,等效于: SomeClass
)都会不使它们可以从子类方法访问,或在外部(分别为: private SomeClass
和this->a
); 因此,基本上someobject.a
在外部不可见,而在内部和派生类中可见(如果未使用protected
),而: private Parent
在派生类和外部都不可见父类的;它仅对父类的方法可见,即使它们是继承的(但不能覆盖)。