class Bird { public Bird() { show(); } public void show() { System.out.println("hey, I'm a bird."); } } class Eagle extends Bird { private String name = "littleEgale"; public Eagle(String name) { this.name = name; } @Override public void show() { System.out.println("I'm a bald eagle, my name is " + name + '.'); } } public class VirtualTester { public static void main(String[] args) { new Eagle("java"); } }
#include <iostream> #include <string> using namespace std; class Bird { public: Bird() { show(); } virtual void show() { cout << "hey, I'm a bird." << endl; } }; class Eagle : public Bird { private : string name; public: Eagle(const string &name):name(name) { } void show() { cout << "I'm a bald eagle, my name is " << name << "." <<endl; } }; int main() { Eagle("cPlusPlus"); }
class Bird(): def __init__(self): self.show() def show(self): print("hey, I'm a bird.") class Eagle(Bird): def __init__(self,name): self.__name = name # 1 Bird.__init__(self) # 2 def show(self): print("I'm a bald eagle, my name is",self.__name,'.') Eagle('python')
java: I'm a bald eagle, my name is null.java
c++: hey, I'm a bird.python
python: I'm a bald eagle, my name is python.ios
Item 9:Never Call Virtual Functions during Construction or Destruction. Effective C++c++
Puzzle 49: Larger Than Life. Java Puzzlerside
不在构造和析构过程当中调用virtual函数, 适用于基类初始化限定在子类初始化以前的语言。 一个设计良好的继承体系,应该避免在基类构造函数中直接或间接的调用被子类重载的方法。函数