1.指向基类的指针类型的一个指针指向了这个类的派生类,那么这个指针能调用这个类的派生类的成员函数(不是虚函数)吗?
比如
class A {
……
}
class B : public A {
public:
void operator();
……
}
A* a = new B;
a->operator();// 可以吗?
2.定义一个纯虚成员函数除了使得它所在的类成为抽象类,还有什么作用?如果没别的作用的话,干嘛不提供直接声明这个类是抽象类的语法?
谢谢大家!
11 个解决方案
#1
1 不行,a中找不到相关函数映射
2 定义成抽象类,就是为了不让产生抽象类的对象,主要用来定义接口使用
2 定义成抽象类,就是为了不让产生抽象类的对象,主要用来定义接口使用
#2
1. 不可以。非虚函数是编译器绑定的,所以不行。
2. 强制派生类实现自己的相应虚函数。
2. 强制派生类实现自己的相应虚函数。
#3
1.肯定不行,非虚函数的调用在编译期已经确定,基类中找不到对应的函数。
2.提供什么样的语法不是我们能考虑的。。。
2.提供什么样的语法不是我们能考虑的。。。
#4
1,不行,父类不能访问子类独有的内容,继承是子类来继承父类的特性,不要搞成父类继承子类
2,除了1楼说的,虚函数还有一个用处就是用来实现多态,是继承了同一父类的不同子类可以有各自不同的行为,但是都可以通过父类提供的接口来访问
2,除了1楼说的,虚函数还有一个用处就是用来实现多态,是继承了同一父类的不同子类可以有各自不同的行为,但是都可以通过父类提供的接口来访问
#5
谢谢,针对两个问题再补充一下
1.现在假设为这样
2.问题基本不变,请回答到点子上,呵呵:定义一个纯虚成员函数除了使得它所在的类成为抽象类,使它不能实例化外还有什么作用?如果没别的作用的话,干嘛不提供直接声明这个类是抽象类的语法? 声明为虚函数不也能强制派生类来实现这个函数吗?
1.现在假设为这样
class A {
public:
virtual void operator();
……
}
class B : public A {
public:
void operator(); // 在这个函数中会调用anotherOperator,但anotherOperator不是虚函数
void anotherOperator();
……
}
A* a = new B;
a->operator();// 可以吗?
2.问题基本不变,请回答到点子上,呵呵:定义一个纯虚成员函数除了使得它所在的类成为抽象类,使它不能实例化外还有什么作用?如果没别的作用的话,干嘛不提供直接声明这个类是抽象类的语法? 声明为虚函数不也能强制派生类来实现这个函数吗?
#6
1.指向基类的指针类型的一个指针指向了这个类的派生类,那么这个指针能调用这个类的派生类的成员函数(不是虚函数)吗?
基类指针或引用只能用于调用基类方法。
2.定义一个纯虚成员函数除了使得它所在的类成为抽象类,还有什么作用?如果没别的作用的话,干嘛不提供直接声明这个类是抽象类的语法?
虚函数可以在派生类中重新实现。
补充:
派生类对像可以使用基类的方法,条件是方法不是私有的;
基类指针可以在不进行显式类型转换的情况下指向派生类对像;
基类引用可以在不进行显示类型转换的情况下引用派生类对像;
蕨类指针或引用只能用于调用基类方法。
基类指针或引用只能用于调用基类方法。
2.定义一个纯虚成员函数除了使得它所在的类成为抽象类,还有什么作用?如果没别的作用的话,干嘛不提供直接声明这个类是抽象类的语法?
虚函数可以在派生类中重新实现。
补充:
派生类对像可以使用基类的方法,条件是方法不是私有的;
基类指针可以在不进行显式类型转换的情况下指向派生类对像;
基类引用可以在不进行显示类型转换的情况下引用派生类对像;
蕨类指针或引用只能用于调用基类方法。
#7
好的谢谢大家。
请看看我在5楼的那段代码,通过指向基类的指针间接的访问了派生类的成员函数(不是虚函数)也是合法的对吧?我在vc下编译通过了
请看看我在5楼的那段代码,通过指向基类的指针间接的访问了派生类的成员函数(不是虚函数)也是合法的对吧?我在vc下编译通过了
#8
1,是可以的,不过访问的其实是B的方法,具体请查阅虚函数的实现
2,没太看明白lz到底想问什么
2,没太看明白lz到底想问什么
#9
楼主的第一帖大伙儿已经说得很清楚了, 第二贴是不能编译通过的吧, 另外还是某位仁兄所说,语言怎么定义不是我们所能考虑的
#10
学习!
#11
可以,不过不是直接调用。还要在基类中加一个虚成员函数,就是反回当前对像的THIS指针。。然后用这个去调用。去试试
#1
1 不行,a中找不到相关函数映射
2 定义成抽象类,就是为了不让产生抽象类的对象,主要用来定义接口使用
2 定义成抽象类,就是为了不让产生抽象类的对象,主要用来定义接口使用
#2
1. 不可以。非虚函数是编译器绑定的,所以不行。
2. 强制派生类实现自己的相应虚函数。
2. 强制派生类实现自己的相应虚函数。
#3
1.肯定不行,非虚函数的调用在编译期已经确定,基类中找不到对应的函数。
2.提供什么样的语法不是我们能考虑的。。。
2.提供什么样的语法不是我们能考虑的。。。
#4
1,不行,父类不能访问子类独有的内容,继承是子类来继承父类的特性,不要搞成父类继承子类
2,除了1楼说的,虚函数还有一个用处就是用来实现多态,是继承了同一父类的不同子类可以有各自不同的行为,但是都可以通过父类提供的接口来访问
2,除了1楼说的,虚函数还有一个用处就是用来实现多态,是继承了同一父类的不同子类可以有各自不同的行为,但是都可以通过父类提供的接口来访问
#5
谢谢,针对两个问题再补充一下
1.现在假设为这样
2.问题基本不变,请回答到点子上,呵呵:定义一个纯虚成员函数除了使得它所在的类成为抽象类,使它不能实例化外还有什么作用?如果没别的作用的话,干嘛不提供直接声明这个类是抽象类的语法? 声明为虚函数不也能强制派生类来实现这个函数吗?
1.现在假设为这样
class A {
public:
virtual void operator();
……
}
class B : public A {
public:
void operator(); // 在这个函数中会调用anotherOperator,但anotherOperator不是虚函数
void anotherOperator();
……
}
A* a = new B;
a->operator();// 可以吗?
2.问题基本不变,请回答到点子上,呵呵:定义一个纯虚成员函数除了使得它所在的类成为抽象类,使它不能实例化外还有什么作用?如果没别的作用的话,干嘛不提供直接声明这个类是抽象类的语法? 声明为虚函数不也能强制派生类来实现这个函数吗?
#6
1.指向基类的指针类型的一个指针指向了这个类的派生类,那么这个指针能调用这个类的派生类的成员函数(不是虚函数)吗?
基类指针或引用只能用于调用基类方法。
2.定义一个纯虚成员函数除了使得它所在的类成为抽象类,还有什么作用?如果没别的作用的话,干嘛不提供直接声明这个类是抽象类的语法?
虚函数可以在派生类中重新实现。
补充:
派生类对像可以使用基类的方法,条件是方法不是私有的;
基类指针可以在不进行显式类型转换的情况下指向派生类对像;
基类引用可以在不进行显示类型转换的情况下引用派生类对像;
蕨类指针或引用只能用于调用基类方法。
基类指针或引用只能用于调用基类方法。
2.定义一个纯虚成员函数除了使得它所在的类成为抽象类,还有什么作用?如果没别的作用的话,干嘛不提供直接声明这个类是抽象类的语法?
虚函数可以在派生类中重新实现。
补充:
派生类对像可以使用基类的方法,条件是方法不是私有的;
基类指针可以在不进行显式类型转换的情况下指向派生类对像;
基类引用可以在不进行显示类型转换的情况下引用派生类对像;
蕨类指针或引用只能用于调用基类方法。
#7
好的谢谢大家。
请看看我在5楼的那段代码,通过指向基类的指针间接的访问了派生类的成员函数(不是虚函数)也是合法的对吧?我在vc下编译通过了
请看看我在5楼的那段代码,通过指向基类的指针间接的访问了派生类的成员函数(不是虚函数)也是合法的对吧?我在vc下编译通过了
#8
1,是可以的,不过访问的其实是B的方法,具体请查阅虚函数的实现
2,没太看明白lz到底想问什么
2,没太看明白lz到底想问什么
#9
楼主的第一帖大伙儿已经说得很清楚了, 第二贴是不能编译通过的吧, 另外还是某位仁兄所说,语言怎么定义不是我们所能考虑的
#10
学习!
#11
可以,不过不是直接调用。还要在基类中加一个虚成员函数,就是反回当前对像的THIS指针。。然后用这个去调用。去试试