display中virtual,在父类中必须有virtual 否则可能会出错
#include <iostream> #include <string> using namespace std; class Person { public: Person(const string& name="") :_name(name) {} ~Person() { } void Display() { cout << "person" << endl; } protected: string _name; }; class student:public Person { public: student(const string& name,const int num) :Person(name) , _num(num) { } ~student() {} virtual void Display() { cout << "student" << endl; } protected: int _num; }; void Test2() { Person p1("头头"); Person* p2 = &p1; p1.Display(); p2->Display(); student s1("大头",4130905); p2 = (student* )&s1; s1.Display(); p2->Display(); } int main() { Test2(); system("pause"); return 0; } //class Botany //{ //public: // Botany(const string& name="") // :_name(name) // { // cout << "Botany(const string& name)" << endl; // ++_sCount; // } // Botany(const Botany& s) // { // cout << "Botany(const Botany& s)" << endl; // _name = s._name; // ++_sCount; // } // Botany operator=(const Botany& b) // { // cout << "Botany operator=(const Botany& b)" << endl; // if (this != &b) // { // _name = b._name; // } // // return *this; // } // virtual void Display() // { // cout << "Botany:" << _name<< endl; // } //protected: // string _name; //名字 // static int _sCount; //}; //int Botany::_sCount = 0; // //class Tree: virtual public Botany //{ //public: // Tree(const string& name,int hight) // :Botany(name) // , _hight(hight) // { // ++_sCount; // } // Tree(Tree& t) // :Botany(t._name) // , _hight(t._hight) // { // } // Tree operator=(Tree& t) // { // if (this != &t) // { // _name = t._name; // _hight = t._hight; // } // // return *this; // } // virtual void Display() // { // cout << "Tree:" << _name << endl; // cout << "Tree hight:" << _hight << endl; // } //protected: // int _hight; //}; //class Flower :virtual public Botany //{ //public: // Flower(const string& name, const string& colour) // :Botany(name) // , _colour(colour) // { // ++_sCount; // } // Flower(Flower& f) // :Botany(f._name) // , _colour(f._colour) // { // } // Flower operator=(Flower& f) // { // if (this != &f) // { // _name = f._name; // _colour = f._colour; // } // // return *this; // } // virtual void Display() // { // cout << "flower:" << _name << endl; // cout << "flower colour:" << _colour << endl; // } //protected: // string _colour; //}; //class MicheliaAlba : public Flower, public Tree //{ //public: // MicheliaAlba(const string& name,const string& colour, const int hight,const string& kind) // :Botany(name) // ,Flower(name,colour) // , Tree(name,hight) // , _kind(kind) // { // ++_sCount; // } // MicheliaAlba(MicheliaAlba& f) // :Botany(f._name) // , Flower(f._name, f._colour) // , Tree(f._name, f._hight) // , _kind(f._kind) // { // } // MicheliaAlba operator=(MicheliaAlba& m) // { // if (this != &m) // { // _name = m._name; // _colour = m._colour; // _hight = m._hight; // _kind = m._kind; // } // // return *this; // } // virtual void Display() // { // cout << "MicheliaAlba flower colour:" << _colour << endl; // cout << "MicheliaAlba tree hight:" << _hight << endl; // cout << "MicheliaAlba kind:" << _kind << endl; // // } //protected: // string _kind;; //}; //void Test1() //{ // Botany b1("植物"); // b1.Display(); // // Tree t1("松树",100); // t1.Display(); // // Flower f1("百合","白色"); // f1.Display(); // MicheliaAlba m1("白兰花","白色",200,"好看"); // m1.Display(); //} //int main() //{ // Test1(); // system("pause"); // return 0; //}