指向基类的指针调用派生类成员函数的问题

时间:2022-08-30 09:43:11
两个问题

1.指向基类的指针类型的一个指针指向了这个类的派生类,那么这个指针能调用这个类的派生类的成员函数(不是虚函数)吗?
比如
class A {
……
}
class B : public A {
public:
void operator();
……
}

A* a = new B;
a->operator();// 可以吗?


2.定义一个纯虚成员函数除了使得它所在的类成为抽象类,还有什么作用?如果没别的作用的话,干嘛不提供直接声明这个类是抽象类的语法?

谢谢大家!

11 个解决方案

#1


1 不行,a中找不到相关函数映射
2 定义成抽象类,就是为了不让产生抽象类的对象,主要用来定义接口使用

#2


1. 不可以。非虚函数是编译器绑定的,所以不行。
2. 强制派生类实现自己的相应虚函数。

#3


1.肯定不行,非虚函数的调用在编译期已经确定,基类中找不到对应的函数。
2.提供什么样的语法不是我们能考虑的。。。

#4


1,不行,父类不能访问子类独有的内容,继承是子类来继承父类的特性,不要搞成父类继承子类
2,除了1楼说的,虚函数还有一个用处就是用来实现多态,是继承了同一父类的不同子类可以有各自不同的行为,但是都可以通过父类提供的接口来访问

#5


谢谢,针对两个问题再补充一下
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.定义一个纯虚成员函数除了使得它所在的类成为抽象类,还有什么作用?如果没别的作用的话,干嘛不提供直接声明这个类是抽象类的语法?
虚函数可以在派生类中重新实现。

补充:
  派生类对像可以使用基类的方法,条件是方法不是私有的;
  基类指针可以在不进行显式类型转换的情况下指向派生类对像;
  基类引用可以在不进行显示类型转换的情况下引用派生类对像;
  蕨类指针或引用只能用于调用基类方法。

#7


好的谢谢大家。

请看看我在5楼的那段代码,通过指向基类的指针间接的访问了派生类的成员函数(不是虚函数)也是合法的对吧?我在vc下编译通过了

#8


1,是可以的,不过访问的其实是B的方法,具体请查阅虚函数的实现
2,没太看明白lz到底想问什么

#9


楼主的第一帖大伙儿已经说得很清楚了, 第二贴是不能编译通过的吧, 另外还是某位仁兄所说,语言怎么定义不是我们所能考虑的

#10


学习!

#11


可以,不过不是直接调用。还要在基类中加一个虚成员函数,就是反回当前对像的THIS指针。。然后用这个去调用。去试试

#1


1 不行,a中找不到相关函数映射
2 定义成抽象类,就是为了不让产生抽象类的对象,主要用来定义接口使用

#2


1. 不可以。非虚函数是编译器绑定的,所以不行。
2. 强制派生类实现自己的相应虚函数。

#3


1.肯定不行,非虚函数的调用在编译期已经确定,基类中找不到对应的函数。
2.提供什么样的语法不是我们能考虑的。。。

#4


1,不行,父类不能访问子类独有的内容,继承是子类来继承父类的特性,不要搞成父类继承子类
2,除了1楼说的,虚函数还有一个用处就是用来实现多态,是继承了同一父类的不同子类可以有各自不同的行为,但是都可以通过父类提供的接口来访问

#5


谢谢,针对两个问题再补充一下
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.定义一个纯虚成员函数除了使得它所在的类成为抽象类,还有什么作用?如果没别的作用的话,干嘛不提供直接声明这个类是抽象类的语法?
虚函数可以在派生类中重新实现。

补充:
  派生类对像可以使用基类的方法,条件是方法不是私有的;
  基类指针可以在不进行显式类型转换的情况下指向派生类对像;
  基类引用可以在不进行显示类型转换的情况下引用派生类对像;
  蕨类指针或引用只能用于调用基类方法。

#7


好的谢谢大家。

请看看我在5楼的那段代码,通过指向基类的指针间接的访问了派生类的成员函数(不是虚函数)也是合法的对吧?我在vc下编译通过了

#8


1,是可以的,不过访问的其实是B的方法,具体请查阅虚函数的实现
2,没太看明白lz到底想问什么

#9


楼主的第一帖大伙儿已经说得很清楚了, 第二贴是不能编译通过的吧, 另外还是某位仁兄所说,语言怎么定义不是我们所能考虑的

#10


学习!

#11


可以,不过不是直接调用。还要在基类中加一个虚成员函数,就是反回当前对像的THIS指针。。然后用这个去调用。去试试