new和virtual的区分

1.virtual和override是一起使用的

2.如果要实现Virtual方法就必须要使用override或new关键字(new和override产生的机理不同)。

3.如果没有virtual子类重写此方法默认是使用new关键字重写此方法

4.New关键字主要用来区别派生类和基类同名方法的选择问题,通过隐藏基类方法,达到使编译器调用正确的方法的目的。Override主要用来对基类的方法和虚方法进行重写。

5.虚方法可以在基类实现部分方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你的代码存在一些问题,导致程序无法正常输出结果。首先,在 `Student` 类的构造函数中,你应该将 `clas` 和 `id` 分别赋值为 `cl` 和 `i`,而不是反过来。此外,在 `Graduate` 类的构造函数中,你将 `Teacher` 和 `Student` 的构造函数都调用了一遍,应该只调用其中一个。 另外,由于你在 `Student` 和 `Teacher` 类中都定义了 `showMe` 函数,因此在 `Graduate` 类中就需要使用作用域限定符来区分调用哪个类的 `showMe` 函数。 修改后的代码如下: ``` #include<iostream> #include<cstring> using namespace std; class Person { private: char name[10], sex; int age; public: Person(char* s, int n, char c) { int len = strlen(s); int i; for (i = 0; i < len; i++) { name[i] = s[i]; } name[i] = '\0'; age = n; sex = c; } char* getname() { return name; } int getage() { return age; } char getsex() { return sex; } void showMe() { cout << "name:" << getname() << endl << "sex:" << getsex() << endl << "age:" << getage() << endl; } }; class Student : virtual public Person { private: char* clas; char* id; public: Student(char* s, int n, char c, char* cl, char* i) : Person(s, n, c) { int len1 = strlen(cl); clas = new char[len1 + 1]; strcpy(clas, cl); int len2 = strlen(i); id = new char[len2 + 1]; strcpy(id, i); } void showMe() { cout << "class:" << clas << endl << "id:" << id << endl; } ~Student() { delete[] id; delete[] clas; } }; class Teacher : virtual public Person { private: char* dept; int salary; public: Teacher(char* s, int n, char c, char* d, int sa) : Person(s, n, c) { int len = strlen(d); dept = new char[len + 1]; strcpy(dept, d); salary = sa; } void showMe() { cout << "dept:" << dept << endl << "salary:" << salary << endl; } ~Teacher() { delete[] dept; } }; class Graduate : public Teacher, public Student { public: Graduate(char* na, int ag, char c, char* d, int s, char* cl, char* id) : Person(na, ag, c), Teacher(na, ag, c, d, s), Student(na, ag, c, cl, id) {} void showMe() { Student::showMe(); Person::showMe(); Teacher::showMe(); } }; int main() { Graduate stu1("Lisi", 22, 'm', "College of Informatics", 2000, "2015013", "S101"); stu1.showMe(); return 0; } ``` 运行结果如下: ``` class:2015013 id:S101 name:Lisi sex:m age:22 dept:College of Informatics salary:2000 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值