谁能帮我改好这几句代码?

sanjiang 2002-03-18 02:09:18
#include <iostream.h>

class base{
public:
virtual void v() const=0;
virtual void f() const=0{
cout<<"base::f()\n";
}

};

class X:public base{
public:
void v(){base::v();}
void f(){base::f();}
};

void base::f()
{
cout<<"base::f()\n";
}
main()
{
X x;
x.v();
x.f();
}
...全文
29 13 打赏 收藏 举报
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
sanjiang 2002-03-20
jerrytse(聪明笨伯)让我茅塞顿开.谢谢!
  • 打赏
  • 举报
回复
jerrytse 2002-03-19
to sanjiang:
我想有这样的可能性,因为你把f()和v()的定义放在了Base里头,这两个函数就成了内联函数,inline function。
你看看《Thinking in C++》就知道了,内联函数实际上就是把函数体在你调用函数的地方插入函数体,就有点象宏替换(不过提供了参数和返回值的类型检查)。而且你的v()和f()中完全不涉及类里头的属性,所以在编译的时候,你main()中的代码就变成了。
X* x;
cout<<"Base::f()\n"; // x->f();
所以,就能够正确的调用了。
  • 打赏
  • 举报
回复
jerrytse 2002-03-19
还有,建议fireseed(CreamDog)不要老是想当然,有时候动手做一下实验的,会令你有更深刻的理解,特别是程序设计。
  • 打赏
  • 举报
回复
jerrytse 2002-03-19
fireseed(CreamDog)的理解很有问题,纯虚函数当然可以有函数体,并且在派生类中,也可以调用父类里面的纯虚函数。这是完全没有问题的。
注意你的p229,“它在该基类中没有定义具体的操作内容”,而不是“不允许定义具体内容”,在虚基类里头,完全可以定义纯虚函数为派生类提供默认操作。当派生类不需要自己的操作的时候,就调用父类的纯虚函数。
正如上面的例子
Base::v();

建议fireseed(CreamDog)深入的读一下书本,或者虚心请教一下学校的老师
  • 打赏
  • 举报
回复
sanjiang 2002-03-18
这样写100%正确的:

#include <iostream>
using namespace std;

class Base {
public:
virtual void v() const = 0;
virtual void f() const = 0;
};


void Base::f() const {
cout << "Base::f()\n";
}

void Base::v() const { cout << "Base::v()\n";}

class D : public Base {
public:
// Use the common Base code:
void v() const { Base::v(); }
void f() const { Base::f(); }
};

void main() {
D d;
d.v();
d.f();
}
  • 打赏
  • 举报
回复
sanjiang 2002-03-18
[22.4] 什么是“纯虚”成员函数?
...
...
注意,为纯虚函数提供一个实现是可能的,但是这样通常会使初学者糊涂,并且最好避免这样,直到熟练之后.

见于:
http://www.sunistudio.com/cppfaq/abcs.html
  • 打赏
  • 举报
回复
fireseed 2002-03-18
/**********************感谢关注*********************/
///////////////////////Creamdog//////////////////////

《C++语言程序设计》清华大学出版社
P229
纯虚函数是一个在基类中说明的虚函数,它在该基类中没有定义具体的操作内容,要求各派生类根据实际需要定义自己的版本。
  • 打赏
  • 举报
回复
shenleav 2002-03-18
up
  • 打赏
  • 举报
回复
sanjiang 2002-03-18
up
  • 打赏
  • 举报
回复
sanjiang 2002-03-18
是Thinking in C++的一个例子程序.
  • 打赏
  • 举报
回复
sanjiang 2002-03-18
谢谢fireseed(Creamdog) 的帮助.但在Think C++里面说纯虚函数也可以有函数体.
而下面的代码是成功(编译运行--VC6)的:
#include <iostream.h>

class base{
public:
virtual void v() const=0{
cout<<"base::f()\n";
}
virtual void f() const=0{
cout<<"base::f()\n";
}

};

class X:public base{
public:
void v(){base::v();}
void f(){base::f();}
};

void main()
{
X* x;//虽然没有使用new.
x->v();
x->f();
}
  • 打赏
  • 举报
回复
fireseed 2002-03-18
/***********************感谢关注*******************/
////////////////////////Creamdog////////////////////

1. 纯虚函数怎么可以有函数体呢??
void base::f()
{
cout<<"base::f()\n";
}
2. 这里是错的,但我不知道你的意图;
还有,这里
void v(){base::v();}
void f(){base::f();}
直接调用纯虚函数是没有任何意义的!
3. 纯虚函数的定义不能有const!
4.任何函数的默认返回值是int,所以你的main前要加void或返回1;

最后应该是这个样子
#include <iostream.h>

class base
{
public:
virtual void v() = 0;
virtual void f() = 0;
};

class X : public base
{
public:
void v();
void f();
};

void X::f()
{
cout<<"base::f()\n";
}
void X::v()
{
cout<<"base::v()\n";
}
void main()
{
X x;
x.v();
x.f();
}


  • 打赏
  • 举报
回复
sanjiang 2002-03-18
如果我把f()的定义放入base类内部,
而main里面这么使用:
X* p;//未用new初始化.
p->v();
p->f();
竟然也能得到正确结果
为什么?
  • 打赏
  • 举报
回复
相关推荐
发帖
VC/MFC

1.6w+

社区成员

VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
帖子事件
创建了帖子
2002-03-18 02:09
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……