Skip to content

Commit

Permalink
派生类定义和基类同名的函数,即使参数不同,不管是否是虚函数,派生类也无法直接使用基类函数,只能转换成基类才能使用
Browse files Browse the repository at this point in the history
  • Loading branch information
Lee committed Jun 22, 2018
1 parent 4519518 commit 88626c7
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 1 deletion.
19 changes: 19 additions & 0 deletions chapter_13/brass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,15 @@ Brass::~Brass()
show("void Brass::~Brass()\n");
}

void Brass::virtualSameNameHidden(int n)
{
show("void Brass::virtualSameNameHidden(int n)\n");
}

void Brass::sameNameHidden(int n)
{
show("void Brass::sameNameHidden(int n)\n");
}


// BrassPlus-----------------------------------
Expand Down Expand Up @@ -67,3 +76,13 @@ BrassPlus::~BrassPlus()
{
show("void BrassPlus::~BrassPlus()\n");
}

void BrassPlus::virtualSameNameHidden()
{
show("void BrassPlus::virtualSameNameHidden()\n");
}

void BrassPlus::sameNameHidden()
{
show("void BrassPlus::sameNameHidden()\n");
}
6 changes: 6 additions & 0 deletions chapter_13/header/brass.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ class Brass {
// virtual ~Brass(); // 虚析构函数,保正派生类释放时,基类正常释放
~Brass(); // 虚析构函数,保正派生类释放时,基类正常释放

virtual void virtualSameNameHidden(int n);
void sameNameHidden(int n);
};

class BrassPlus : public Brass {
Expand All @@ -41,6 +43,10 @@ class BrassPlus : public Brass {
void ResetMax(double m) { maxloan = m; };
void ResetRate(double r) { rate = r; };
void ReseOwes() { owesBank = 0; }

virtual void virtualSameNameHidden();
void sameNameHidden();

};


Expand Down
19 changes: 18 additions & 1 deletion chapter_13/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,10 +75,27 @@ void virtual_test(void)
}

{
//如果基类Brass的析构函数不是虚的,则时方时不会调用BrassPlus的析构函数
//如果基类Brass的析构函数不是虚的,则释放时不会调用BrassPlus的析构函数
//Brass的析构函数应使用 virtual ~Brass();
mycout();
Brass * p = new BrassPlus;
delete p;
}

{
// 参数不同的同函数将被派生类隐藏, 不管函数是不是虚的,
// 派生类无法直接使用同名的函数,只有向上转换成基类引用时才可使用基类同名函数
mycout();
BrassPlus p("p");
Brass & p1 = p;
p.virtualSameNameHidden();
// p.virtualSameNameHidden(1); //虚函数时,使用基类的同名函数时,派生类将报错
p1.virtualSameNameHidden(1);

p.sameNameHidden();
// p.sameNameHidden(1); //使用基类的同名函数时,派生类将报错
p1.sameNameHidden(1);
}
}


0 comments on commit 88626c7

Please sign in to comment.