如何让自己的代码更加“OO”

gldcpp 2016-12-10 04:52:49
c++可以用虚基类纯虚函数来实现接口,但是对比java的接口,java中接口类可以作为函数参数以便运行期间动态改变,而c++中似乎不可以直接作为参数,这样好像设计上不太方便,如何解决这样的问题呢?
...全文
369 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
yes-hyh 2016-12-13
  • 打赏
  • 举报
回复
5楼做法有什么奇怪的?这是最标准的做法啊!不过个人观点,支持赵4老师的观点,在设计上,OO只是一种编程思想而已,该用则用,不一定要强套,C++和java设计思想不一样的,OO不是C++的全部,在用C++设计时,不要陷入OO的魔怔!
赵4老师 2016-12-12
  • 打赏
  • 举报
回复
面向对象只是一种编程思想。 再抽象的编程语言,最后不都变成汇编代码了吗?我们完全可以说汇编语言是面向对象、脚本化、动态化、泛函化、并行化、分布化的语言。
luciferisnotsatan 2016-12-12
  • 打赏
  • 举报
回复
java本来就是在C++基础上,改进了不怎么OO的地方。 非要C++那么做的话,就像5楼例子一样。这就是C++的“灵活性”
ri_aje 2016-12-12
  • 打赏
  • 举报
回复
引用 14 楼 gldcpp 的回复:
[quote=引用 12 楼 ri_aje 的回复:] c++ 虚函数加基类就是 java 里的接口,非得特别喜欢接口的话,还可以用抽象类。如果你不会用或用着觉得别扭就只能是你自己的问题了。 c++ 还可以用范型提供更漂亮的设计,java 什么都得面向对象,甭管面向对象是否合适。
“虚函数加基类就是 java 里的接口” 怎么实现把接口作为参数我确实不会,这是我的问题,所以来求教来着 [/quote] 就是接收端用基类引用或指针啊。#5 有例子代码。
ID870177103 2016-12-11
  • 打赏
  • 举报
回复
这样不可以吗?
struct A {
	virtual void func () = 0 ;
} ;

struct B :public A {
	void func () override {}
} ;

void call (A &a) {
	a.func () ;
}

int main () {
	call (B ()) ;
	return 0 ;
}
Saleayas 2016-12-11
  • 打赏
  • 举报
回复
C 语言也可以啊!!
gldcpp 2016-12-11
  • 打赏
  • 举报
回复
纠正一下,是抽象类 不是虚基类
ID870177103 2016-12-11
  • 打赏
  • 举报
回复
struct和class的区别只在成员的默认是否可见而已
gldcpp 2016-12-11
  • 打赏
  • 举报
回复
引用 12 楼 ri_aje 的回复:
c++ 虚函数加基类就是 java 里的接口,非得特别喜欢接口的话,还可以用抽象类。如果你不会用或用着觉得别扭就只能是你自己的问题了。 c++ 还可以用范型提供更漂亮的设计,java 什么都得面向对象,甭管面向对象是否合适。
“虚函数加基类就是 java 里的接口” 怎么实现把接口作为参数我确实不会,这是我的问题,所以来求教来着
gldcpp 2016-12-11
  • 打赏
  • 举报
回复
引用 10 楼 ID870177103 的回复:
[quote=引用 7 楼 gldcpp 的回复:] [quote=引用 5 楼 ID870177103 的回复:] 这样不可以吗?
struct A {
	virtual void func () = 0 ;
} ;

struct B :public A {
	void func () override {}
} ;

void call (A &a) {
	a.func () ;
}

int main () {
	call (B ()) ;
	return 0 ;
}
啊,虽然感觉怪怪的不过确实能使,不过这个也基本脱离struct本来的意义了[/quote] struct本来的意义?这是c++标准写法好不,要不写成智能指针? [/quote]我的意思是struct本来是多用于数据结构,如果要实现接口自然优先考虑虚基类而不会去用struct
ri_aje 2016-12-11
  • 打赏
  • 举报
回复
c++ 虚函数加基类就是 java 里的接口,非得特别喜欢接口的话,还可以用抽象类。如果你不会用或用着觉得别扭就只能是你自己的问题了。 c++ 还可以用范型提供更漂亮的设计,java 什么都得面向对象,甭管面向对象是否合适。
ipqtjmqj 2016-12-11
  • 打赏
  • 举报
回复
引用 7 楼 gldcpp 的回复:
[quote=引用 5 楼 ID870177103 的回复:] 这样不可以吗?
struct A {
	virtual void func () = 0 ;
} ;

struct B :public A {
	void func () override {}
} ;

void call (A &a) {
	a.func () ;
}

int main () {
	call (B ()) ;
	return 0 ;
}
啊,虽然感觉怪怪的不过确实能使,不过这个也基本脱离struct本来的意义了[/quote] 用struct 只是省了一个public:而已,c++中class与struct的唯一区别就是默认的访问级别,一个是private另一个是public,为了兼容C才保留的struct关键字。 在模板中,可以用template<class T>或template<typename T>,但不能用struct,因为C中没有模板。
ID870177103 2016-12-11
  • 打赏
  • 举报
回复
引用 7 楼 gldcpp 的回复:
[quote=引用 5 楼 ID870177103 的回复:] 这样不可以吗?
struct A {
	virtual void func () = 0 ;
} ;

struct B :public A {
	void func () override {}
} ;

void call (A &a) {
	a.func () ;
}

int main () {
	call (B ()) ;
	return 0 ;
}
啊,虽然感觉怪怪的不过确实能使,不过这个也基本脱离struct本来的意义了[/quote] struct本来的意义?这是c++标准写法好不,要不写成智能指针?
ooolinux 2016-12-11
  • 打赏
  • 举报
回复
面向对象分析与设计?
gldcpp 2016-12-11
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
java和c++在设计上不具可比性。我觉得。
赵老湿不要惜字如金啊!这是不是也可以说是c++”并不那么面向对象”的一个例子呢?可不可以认为java在设计模式上确实比c++更有优势呢?用c++写代码的时候应该怎么去合理的运用他的特性来设计好程序使他更具灵活性、可读性呢?有没有什么好的博文或书籍推荐啊!
gldcpp 2016-12-11
  • 打赏
  • 举报
回复
引用 5 楼 ID870177103 的回复:
这样不可以吗?
struct A {
	virtual void func () = 0 ;
} ;

struct B :public A {
	void func () override {}
} ;

void call (A &a) {
	a.func () ;
}

int main () {
	call (B ()) ;
	return 0 ;
}
啊,虽然感觉怪怪的不过确实能使,不过这个也基本脱离struct本来的意义了
gldcpp 2016-12-11
  • 打赏
  • 举报
回复
引用 2 楼 ipqtjmqj 的回复:
C语言可以通过函数指针实现接口
用函数指针还是。。。,我这等凡人还是用不来,要说用c语言实现,说到底任何一个面向对象的特性他都可以实现,或者直接用机器码实现算了,这样做感觉实用意义不大,如果一个工程有大量的用函数指针来实现的接口,感觉看完人也歇菜了
ipqtjmqj 2016-12-10
  • 打赏
  • 举报
回复
void *是最通过的接口
ipqtjmqj 2016-12-10
  • 打赏
  • 举报
回复
C语言可以通过函数指针实现接口
赵4老师 2016-12-10
  • 打赏
  • 举报
回复
java和c++在设计上不具可比性。我觉得。

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧