Cpp的Virtual函数不能只声明不定义

在《C++ Prime 中文版 第五版》的451页提到:

声明但是不定义一个成员函数是合法的,对此只有一个例外,我们将在15.2.1节(528页)介绍。

翻到528页,是介绍虚函数的地方。针对于此,使用VS2010编译环境进行验证。

代码1:声明但是不定义virtual函数

#include <iostream>
using namespace std;

class Quote{
public :
    virtual  double net_price(std::size_t n)const; 

};
//virtual  double Quote::net_price(std::size_t n)const 类声明外部的说明符无效
//double Quote::net_price(std::size_t n)const
//{
//
//    return 0.0;
//
//}
int main()
{

    Quote quote;

    cout <<"Test 4 Virtual"<<endl;

    return 0;

}

报错:

1>ClCompile:
1> Test4Virtual.cpp
1>Test4Virtual.obj : error LNK2001: 无法解析的外部符号 "public: virtual double __thiscall Quote::net_price(unsigned int)const " ([email protected]@@[email protected])

代码2:

#include <iostream>
using namespace std;

class Quote{
public :
    virtual  double net_price(std::size_t n)const; 

};
//virtual  double Quote::net_price(std::size_t n)const 类声明外部的说明符无效
double Quote::net_price(std::size_t n)const
{

    return 0.0;

}
int main()
{

    Quote quote;

    cout <<"Test 4 Virtual"<<endl;

    return 0;

}

编译通过,正常运行。这里提一下:在类外定义的地方,不能使用Virtual 。因为该关键词只能出现在类内声明语句之前而不能用于类外部的函数定义。

时间: 2024-10-20 09:16:50

Cpp的Virtual函数不能只声明不定义的相关文章

C++函数声明和定义

声明是告诉编译器一些信息,以协助编译器进行语法分析,避免编译器报错.而定义是告诉编译器生成一些代码,并且这些代码将由连接器使用.即:声明是给编译器用的,定义是给连接器用的.这个说明显得很模糊,为什么非要弄个声明和定义在这搅和?那都是因为C++同意将程序拆成几段分别书写在不同文件中以及上面提到的编译器只从上朝下编译且对每个文件仅编译一次. 编译器编译程序时,只会一个一个源文件编译,并分别生成相应的中间文件(对VC就是.obj文件),然后再由连接器统一将所有的中间文件连接形成一个可执行文件.问题就是

2.4 函数的声明与定义

函数可以先声明后定义,如下: #include<iostream> int show(int, int);//函数声明 int main(){ int a = 1, b = 2, c; c = show(a, b); std::cout << c << std::endl; } //函数定义 int show(int a, int b){ return a + b; }

为什么C++中声明和定义要分开写

现在开始写项目了,你会发现我们一般都要写一个cpp,对应的还得有一个h文件,那么为什么在C++中我们要这么做? .h就是声明,.cpp就是实现,而所谓分离式实现就是指"声明"和"定义"分别保存在不同的文件中,声明保存在.h文件.定义保存在.cpp文件中. 那么将声明和定义分离有什么意义吗? 首先从非分离式(声明的同时给出定义)看,其内容一般保存在.h文件中,以供多个源文件引用. 但是将定义放在头文件,那么当多个源文件使用#include命令包含此类的头文件便会在链接

对声明和定义的理解

可以先看看这篇博客. 一个变量或函数可以被声明无数次,但是却至多只能被定义一次,且在该变量或函数在使用时,必须被定义一次.(若该函数/变量不被使用,则可以只声明不定义) 一.判断一条语句是否为变量的声明:若变量前有extern关键字,则它为声明,若变量前没有extern关键字,则其为定义: extern int i; //声明i int i; //定义i,但未对i进行初始化 int i = 5; //是一个定义,同时对i进行了初始化. 总之:判断一条语句是否为声明的声明,关键是看该语句中是否包含

《Effective C++》:条款35:考虑virtual函数以外的其他选择

条款35:考虑virtual函数以外的其他选择 条款35考虑virtual函数以外的其他选择 藉由Non-virtual Interface手法实现Template Method模式 藉由Function Pointers实现Strategy模式 藉由tr1function完成Strategy模式 古典的Strategy模式 摘要 virtual函数在派生中经常用到,在遇到一些问题时用virtual函数没问题,但是有时候我们应该思考一下是否有替代方案,以此来拓宽我们的视野. 假如现在正在写一个游

Effective C++:条款35:考虑virtual函数以外的其他选择

游戏中的人物伤害值计算问题. (一)方法(1):一般来讲可以使用虚函数的方法: class GameCharacter { public: virtual int healthValue() const; //返回人物的体力值,派生类可以做出修改 ... }; 这确实是一个显而易见的设计选择.但因为这样的设计过于显而易见,可能不会对其它可选方法给予足够的关注.我们来考虑一些处理这个问题的其它方法. (二)方法(2):使用NVI方法,在基类中使用一个公有的普通函数调用私有的虚函数. class G

(转载)你好,C++(24)好大一个箱子!5.1.1 函数的声明和定义

你好,C++(24)好大一个箱子!5.1.1 函数的声明和定义 第5章 用函数封装程序功能 在完成功能强大的工资程序V1.0之后,我们信心倍增,开始向C++世界的更深远处探索. 现在,我们可以用各种数据类型定义变量来表达问题中所涉及的各种数据:用操作符连接这些变量对其进行运算:用程序流程控制结构来控制对这些数据的复杂处理过程,最终实现对数据进行处理得到结果,而这就是程序了.但是,随着要处理的问题越来越复杂,程序的代码自然也就会越来越复杂.如果把所有程序代码都放到main()主函数中,主函数也会越

你好,C++(24)好大一个箱子!5.1.1 函数的声明和定义

第5章 用函数封装程序功能 在完成功能强大的工资程序V1.0之后,我们信心倍增,开始向C++世界的更深远处探索. 现在,我们可以用各种数据类型定义变量来表达问题中所涉及的各种数据:用操作符连接这些变量对其进行运算:用程序流程控制结构来控制对这些数据的复杂处理过程,最终实现对数据进行处理得到结果,而这就是程序了.但是,随着要处理的问题越来越复杂,程序的代码自然也就会越来越复杂.如果把所有程序代码都放到main()主函数中,主函数也会越来越复杂.这就像将所有东西都堆放到一个仓库中,随着东西越堆越多,

关于声明、定义、前向声明、include、循环依赖、普通友元函数、友元类、友元成员函数的总结

做<C++ Primer>(第5版)253页练习题7.3.4有感,故总结之 1 声明 1.1 变量和函数的声明 常见的声明是声明一个变量或函数,一般在头文件.h中声明,例如: pos cursor = 0; // 给定初始值 char get(pos r, pos col) const; 1.2 类的声明 对于一个类,一般是直接在头文件中直接写 class ClassName { ... },这称之为类的定义,然后在类体{...}中又声明或定义了成员变量和成员函数.类的声明是没有类体,只有个类