#include "stdafx.h"
#include <iostream.h>
#include <stdio.h>class Animal
{
public:
virtual void sleep() { printf("Animal sleep!"); }
};class Dog :public Animal
{
public:
//virtual void sleep() { printf("Dog sleep!"); }};
int main(int argc, char* argv[])
{
Dog dog;
dog.sleep; //这行 注意slepp后面没有加()号 提示: warning C4551: function call missing argument list 为什么会提示这个??
return 0;
}
#include <iostream.h>
#include <stdio.h>class Animal
{
public:
virtual void sleep() { printf("Animal sleep!"); }
};class Dog :public Animal
{
public:
//virtual void sleep() { printf("Dog sleep!"); }};
int main(int argc, char* argv[])
{
Dog dog;
dog.sleep; //这行 注意slepp后面没有加()号 提示: warning C4551: function call missing argument list 为什么会提示这个??
return 0;
}
程序在语法上没有问题
dog.sleep;是指向dog中sleep()的指针,也是合法表达式,但执行时什么都不会做
它与以下表达式类似
main()
{
int x=10;
x; //只是一个表达式,不执行任何代码
}
运行时要转换,找到对应的函数入口地址,用dog.sleep()表达才正确
实际上 dog.sleep 只是一个值,并不会出现编译错误
例如
int i;i;
这样也不会出错
i有定义啊 可是sleep没定义啊
{
public:
virtual void sleep() { printf("Animal sleep!"); } //这里不就是sleep的定义吗?
};
Dog dog;
dog.sleep; // 一个函数指针你试试:
typedef void (Dog::*DFun)(); DFun psleep; psleep=dog.sleep; //可将它赋给同类型指针
如:
main()
{
char *c;
c;
char b[];
b;
}c,是一个字符指针,
b[]是数组名,b是字符数组的指针,指向字符串的首地址!
dog.sleep()是函数名,dog.sleep是指向函数的首地址!
{
public:
virtual void sleep() { printf("Animal sleep!"); } //这里不就是sleep的定义吗?
};
Dog dog;
dog.sleep; // 一个函数指针你试试:
typedef void (Dog::*DFun)(); DFun psleep; psleep=dog.sleep; //可将它赋给同类型指针------------------
正解,函数指针。
i有定义啊 可是sleep没定义啊
---------------------------------------------
sleep有定义,sleep是虚函数表中的一个虚函数指针
------------------------------------------------------
这时VTABLE中会有一个虚函数指针,该指针在未被重载时指向 CDog::sleep()