空虚函数:好的做法?
Empty virtual function: good practice?
我有一个超级class 学生,Junior class 和 Senior class 继承。
virtual void student::attend(void){
//call either Junior's or Senior's attend
//if attend is called on a Student object, do nothing.
}
void Junior::attend(void){
//do stuff
}
void Senior::attend(void){
//do stuff
}
基本上我在 superclass 中的虚方法现在是空的,它所做的只是调用正确的 Senior 或 Junior attend()
。如果在 Student 对象上调用该对象,我不希望发生任何事情。
我正在研究这个的原因是,我想要类似 std::vector <student*> studv
的东西,其中 studv
将包含指向 Senior 和 Junior 的指针,并在向量的每个对象上调用 attend() 而无需指定任何内容.所以,我有两个问题:
a) 这被认为是好的做法吗?有更好的选择吗?
b) 考虑到我的一个继承了 superclass 的 classes 可能永远不会使用其功能之一,我该怎么办?我应该在派生 class 中删除它,还是什么都不做?
非常感谢!
真正的问题是 student
对象是否会自己创建(相对于作为 Junior
或 Senior
的子对象)。如果它不会被创建,考虑声明一个对 student
什么都不做的函数是纯虚拟的:
virtual void attend() = 0;
那么你将不能自己创建一个student
对象——如果你尝试,你会得到一个编译器错误——而且,它是自己的-记录那个事实,你也不必提供一个空的实现。几个好处。
我有一个超级class 学生,Junior class 和 Senior class 继承。
virtual void student::attend(void){
//call either Junior's or Senior's attend
//if attend is called on a Student object, do nothing.
}
void Junior::attend(void){
//do stuff
}
void Senior::attend(void){
//do stuff
}
基本上我在 superclass 中的虚方法现在是空的,它所做的只是调用正确的 Senior 或 Junior attend()
。如果在 Student 对象上调用该对象,我不希望发生任何事情。
我正在研究这个的原因是,我想要类似 std::vector <student*> studv
的东西,其中 studv
将包含指向 Senior 和 Junior 的指针,并在向量的每个对象上调用 attend() 而无需指定任何内容.所以,我有两个问题:
a) 这被认为是好的做法吗?有更好的选择吗? b) 考虑到我的一个继承了 superclass 的 classes 可能永远不会使用其功能之一,我该怎么办?我应该在派生 class 中删除它,还是什么都不做?
非常感谢!
真正的问题是 student
对象是否会自己创建(相对于作为 Junior
或 Senior
的子对象)。如果它不会被创建,考虑声明一个对 student
什么都不做的函数是纯虚拟的:
virtual void attend() = 0;
那么你将不能自己创建一个student
对象——如果你尝试,你会得到一个编译器错误——而且,它是自己的-记录那个事实,你也不必提供一个空的实现。几个好处。